нет привязки команды в checkBox-е

418
28 декабря 2016, 02:29

здравствуйте, нужно, чтобы параметром команды щелчка по checkbox был сам этот checkbox и возможно было в viewModel считать Uid этого checkbox. максимально упростил свой код...

<ListBox ItemsSource="{Binding Collection}">
        <ListBox.ItemTemplate>
               <DataTemplate>
                         <CheckBox  Command="{Binding CheckBoxCommand}"
                                    CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
                                    Uid="{Binding Element.Id}"/>  <!--прибиндили к полю id поля Element из структуры из которых состоит Collection -->
               </DataTemplate>
        </ListBox.ItemTemplate>
</ListBox>

RelayCommand:

public class RelayCommand<T> : ICommand
{
    private readonly Action<T> _execute;
    private readonly Predicate<T> _canExecute;
    public event EventHandler CanExecuteChanged;
    public RelayCommand(Action<T> execute)
        : this(execute, null)
    {
    }
    public RelayCommand(Action<T> execute, Predicate<T> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("предикат не должен быть равным нулю");
        _execute = execute;
        _canExecute = canExecute;
    }
    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute((T)parameter);
    }

    public void Execute(object parameter)
    {
        _execute((T)parameter);
    }
    public void RaiseCanExecuteChanged()
    {
        var handler = CanExecuteChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

viewModel:

class ViewModel 
{
    /// <summary>
    /// команда щелчка по checkbox
    /// </summary>
    private ICommand checkBoxCommand = null;
    public ICommand CheckBoxCommand
    {
        get 
        {
            if (checkBoxCommand == null)
            {
                checkBoxCommand = new RelayCommand<CheckBox>(AddData);
            }
            return checkBoxCommand; 
        }
    }
    private void AddData(CheckBox o)
    {
        var df = ((CheckBox)o).Uid;
        int brackPoint = 0;
    }

    /// <summary>
    /// конструктор
    /// </summary>
    public ViewModel()
    {
    }
    public ObservableCollection<Element> Collection 
    {
       /**/
    }

}

Model(упрощенно):

Struct Element {
     public ObservableCollection<someClass> Collection
     { /**/ }
     public int Id { /**/ };
}

ставлю бряк в addData и щелкаю по checkBox - не заходит в addData, однако ошибок никаких нету... помогите решить проблему

Answer 1

Привязывайтесь к контексту окна по имени. Вы переопределили контекст когда задали ItemSource.

<Window x:Name="Main" ...
<CheckBox  Command="{Binding DataContext.CheckBoxCommand, ElementName=Main}"...

Совет. Для того, чтобы сохранить изоляцию ViewModel от View рекомендую передавать в качестве параметра не CheckBox, а Element

 <CheckBox Command="{Binding DataContext.CheckBoxCommand, ElementName=Main}"
           CommandParameter="{Binding}"...

ViewModel:

checkBoxCommand = new RelayCommand<Element>(AddData);
private void AddData(Element e)
{
    var df = e.Id;
    ...
}
READ ALSO
Понять, что упаковано в object

Понять, что упаковано в object

Например, есть какой-то известный пользовательский тип(его либа есть в проекте), который приведен к типу object

345
Сформировать UPDATE в Entity Framework

Сформировать UPDATE в Entity Framework

Вопрос проще понять, если сразу взглянуть на код

347
Блок схема foreach

Блок схема foreach

Как изобразить на блок схему цикл foreach?

1847