gpt4 book ai didi

c# - WPF CommandParameter 绑定(bind)和 canExecute

转载 作者:太空狗 更新时间:2023-10-29 21:31:26 24 4
gpt4 key购买 nike

我有一个 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 实体。

问题是:如果我将 DelegateCommand 'Add' 与 CanExecutedMethod 一起使用:

AddRate = new DelegateCommand<int?>(AddExecute,AddCanExecute);

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

作为解决方法,我可以使用仅执行委托(delegate)的命令:

Add = new DelegateCommand<int?>(AddExecute);

AddExecute 使用正确的 ID 值调用并且运行良好。但我仍然想使用 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();
}
}

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

关于c# - WPF CommandParameter 绑定(bind)和 canExecute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1748792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com