对于此列中的每个单元格,我想从我的视图模型中绑定一个命令, 在每个可以执行该命令我不想发送我的项目中的每个项目的“实体”属性 来源。
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更改时)