DataGridCellTemplate绑定到ViewModel命令

时间:2013-11-07 09:38:35

标签: c# wpf datagrid icommand celltemplate

对于此列中的每个单元格,我想从我的视图模型中绑定一个命令, 在每个可以执行该命令我不想发送我的项目中的每个项目的“实体”属性 来源。

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,

问题是绑定命令时可以使用null参数引发执行

调试时,似乎CommandParameter仅在Command(因此为空值)

之后绑定

当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();

我相信这会解决问题,因为命令会再次查询所有命令参数 并且命令参数会对它的所有绑定进行采样,它似乎似乎没有被引擎盖下的复选框控件处理(正如我之前提到的CommandParameter更改时)

0 个答案:

没有答案