我有一个treeView项目的模板:
<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实体。
问题是:如果我在CanExecutedMethod中使用DelegateCommand 'Add‘:
AddRate = new DelegateCommand<int?>(AddExecute,AddCanExecute);它只被调用一次,并且参数为空(而textBlock显示正确的ID值)。在调用ID属性之前调用CanExecute (用调试器检查)。在绑定到实际参数之前,wpf似乎正在调用canExecute,但忘记了这一点。一旦绑定完成并加载了正确的值,它就不会再次调用CanExecute。
作为一种解决办法,我可以将命令与execute execute execute一起使用:
Add = new DelegateCommand<int?>(AddExecute);AddExecute是使用正确的ID值调用的,并且工作正常。但我仍然想使用CanExecute功能。有什么想法吗?
发布于 2011-10-14 17:50:15
在这种情况下,最好在用作命令参数的属性上调用RaiseCanExecuteChanged()。在本例中,它是您的ViewModel (或您正在使用的任何DataContext )中的ID属性。
它应该是这样的:
private int? _id;
public int? ID
{
get { return _id; }
set
{
_id = value;
DelegateCommand<int?> command = ((SomeClass)CalcEditView.DataContext).Add;
command.RaiseCanExecuteChanged();
}
}效果将与您的解决方案相同,但它使Command逻辑远离代码隐藏。
发布于 2009-11-17 21:21:34
您可以尝试使用CommandManager.InvalidateRequerySuggested强制更新。
发布于 2015-01-04 19:48:37
我将参数用作object,然后将其转换回int。
Add = new DelegateCommand<object>(add, canAdd);和在add方法中
void add(object parameter){
int id = Convert.ToInt32(parameter);
//or simply
int id2 = (int)parameter;
//...
// do your stuff
//...
}https://stackoverflow.com/questions/1748792
复制相似问题