我有一个树视图项目的模板:
<HierarchicalDataTemplate x:Key="RatesTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=ID}"/>
<Button CommandParameter="{Binding Path=ID}"
Command="{Binding ElementName=CalcEditView, Path=DataContext.Add}">Add</Button>
</StackPanel>
</HierarchicalDataTemplate>
作为 DataContext,我有 ID 字段不为空的 linq 实体。
问题是:如果我将 DelegateCommand 'Add' 与 CanExecutedMethod 一起使用:
AddRate = new DelegateCommand<int?>(AddExecute,AddCanExecute);
它只被调用一次并且参数为空(而textBlock显示正确的ID值)。 CanExecute 在调用 ID 属性之前调用(使用调试器检查)。似乎在绑定到实际参数之前,wpf 正在调用 canExecute 并且忘记了它。一旦绑定完成并加载正确的值,它就不会再次调用 CanExecute。
作为解决方法,我可以使用仅执行委托的命令:
Add = new DelegateCommand<int?>(AddExecute);
使用正确的 ID 值调用 AddExecute 并且工作正常。但我仍然想使用 CanExecute 功能。有任何想法吗?
在这种情况下,最好对用作命令参数的属性调用 RaiseCanExecuteChanged()。在您的情况下,它将是 ViewModel 中的 ID 属性(或您正在使用的任何 DataContext)。
它会是这样的:
private int? _id;
public int? ID
{
get { return _id; }
set
{
_id = value;
DelegateCommand<int?> command = ((SomeClass)CalcEditView.DataContext).Add;
command.RaiseCanExecuteChanged();
}
}
效果将与您的解决方案相同,但它使命令逻辑远离代码隐藏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)