DataGridCellTemplate привязан к команде ViewModel

Для каждой ячейки в этом столбце я хочу привязать команду из моей модели представления, при каждом выполнении этой команды я не хочу отправлять свойство "Entity" каждого элемента в моем источнике элементов.

DataGrid:

   <DataGrid ItemsSource="{Binding Items}">
       <DataGridTemplateColumn Header="C.. Header" >                    
           <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>                              
                    <CheckBox IsChekced="{Binding Entity.IsIncluded, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"                                       
                          CommandParameter="{Binding Entity, Mode=OneWay}"
                          Command="{Binding DataContext.OnDicomAttributeIsIncluded, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Mode=OneWay}"                              />                                  
                </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
   </DataGrid>

поэтому Command и CommandParameter связаны для каждого CheckBox в каждой ячейке,

Проблема в том, что когда команда привязана, она может быть выполнена с параметром, который является нулевым

при его отладке кажется, что CommandParameter привязан только после Command (таким образом, нулевое значение)

также кажется, что флажок, который Raise не может выполнить при обновлении CommandParameter (iv'e посмотрел с использованием рефлектора, и я не увидел никакого обратного вызова к свойству CommandParameter).

Я делал подобные вещи раньше с другими типами ItemsControls, и это никогда не было проблемой, это кажется странным поведением, вызванным нахождением в контексте CellTemplate .

моя команда в виде модели:

    private RelayCommand<DicomAttributeInfo> _onDicomAttributeIncluded;
    public RelayCommand<DicomAttributeInfo> OnDicomAttributeIsIncluded 
    {
        get
        {
            if (_onDicomAttributeIncluded == null)                
                _onDicomAttributeIncluded = new RelayCommand<DicomAttributeInfo>(DicomAttributeIncluded);                                                                
            return _onDicomAttributeIncluded;
        }
    }

моя реализация ICommand:

public class RelayCommand<T> : ICommand
{
    private Predicate<T> _canExecute;
    private Action<T> _execute;

    public RelayCommand(Action<T> execute, Predicate<T> canExecute = null)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    private void Execute(T parameter)
    {
        _execute(parameter);
    }

    private bool CanExecute(T parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

    public bool CanExecute(object parameter)
    { // Here is the problem parameter is null after command is bound           
        return parameter == null ? false :  CanExecute((T)parameter);
    }

    public void Execute(object parameter)
    {
        _execute((T)parameter);
    }

    public event EventHandler CanExecuteChanged;

    public void RaiseCanExecuteChanged()
    {
        var temp = Volatile.Read(ref CanExecuteChanged);

        if (temp != null)
            temp(this, new EventArgs());
    }
}

Есть идеи?

Редактировать:

Я мог бы найти способ сделать:

  _onDicomAttributeIncluded.RaiseCanExecuteChanged();

Я полагаю, что это решит проблему, так как команда снова запросит все свои параметры команды, а параметр команды выберет все ее привязки, просто не представляется правдоподобным, что она не обрабатывается элементом управления checkbox под капотом (как я уже говорил до того, когда был изменен CommandParameter)

0 ответов

Другие вопросы по тегам