首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF CommandParameter绑定和canExecute

WPF CommandParameter绑定和canExecute
EN

Stack Overflow用户
提问于 2009-11-17 21:15:05
回答 3查看 9.3K关注 0票数 6

我有一个treeView项目的模板:

代码语言:javascript
复制
<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‘:

代码语言:javascript
复制
AddRate = new DelegateCommand<int?>(AddExecute,AddCanExecute);

它只被调用一次,并且参数为空(而textBlock显示正确的ID值)。在调用ID属性之前调用CanExecute (用调试器检查)。在绑定到实际参数之前,wpf似乎正在调用canExecute,但忘记了这一点。一旦绑定完成并加载了正确的值,它就不会再次调用CanExecute。

作为一种解决办法,我可以将命令与execute execute execute一起使用:

代码语言:javascript
复制
Add = new DelegateCommand<int?>(AddExecute);

AddExecute是使用正确的ID值调用的,并且工作正常。但我仍然想使用CanExecute功能。有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-14 17:50:15

在这种情况下,最好在用作命令参数的属性上调用RaiseCanExecuteChanged()。在本例中,它是您的ViewModel (或您正在使用的任何DataContext )中的ID属性。

它应该是这样的:

代码语言:javascript
复制
private int? _id;
public int? ID
{
    get { return _id; }
    set
    {
        _id = value;
        DelegateCommand<int?> command = ((SomeClass)CalcEditView.DataContext).Add;
        command.RaiseCanExecuteChanged();
    }
}

效果将与您的解决方案相同,但它使Command逻辑远离代码隐藏。

票数 4
EN

Stack Overflow用户

发布于 2009-11-17 21:21:34

您可以尝试使用CommandManager.InvalidateRequerySuggested强制更新。

票数 2
EN

Stack Overflow用户

发布于 2015-01-04 19:48:37

我将参数用作object,然后将其转换回int

代码语言:javascript
复制
Add = new DelegateCommand<object>(add, canAdd);

和在add方法中

代码语言:javascript
复制
void add(object parameter){
    int id = Convert.ToInt32(parameter);

    //or simply

    int id2 = (int)parameter;

    //...
    //  do your stuff
    //...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1748792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档