gpt4 book ai didi

WPF - 从 UserControl 发出命令时 CanExecute 不会触发

转载 作者:行者123 更新时间:2023-12-02 09:01:11 27 4
gpt4 key购买 nike

我有一个按钮条用户控件,我想在我的大多数表单上使用它。

我添加了如下命令...

    public ICommand Create
{
get
{
return buttonCreate.Command;
}
set
{
buttonCreate.Command = value;
}
}

我已将它们设置为依赖属性,以便我可以绑定(bind)到它们...

        public static readonly DependencyProperty CreateCommandProperty =
DependencyProperty.Register(
"Create",
typeof(ICommand),
typeof(StandardButtonStrip),
new PropertyMetadata((ICommand)null));

然后我将我的用户控件绑定(bind)到命令...

<commoncontrols:StandardButtonStrip HorizontalAlignment="Stretch" Create="{Binding CreateCommand}" />

我正在按如下方式设置命令...

_viewModel.CreateCommand = new DelegateCommand<object>(OnCreateCommand, CanCreate);

但尽管事实上我总是在 CanCreate 方法上返回 true,但按钮被禁用......如果我在 return true 上放置一个断点,它永远不会触发!

    public bool CanCreate(object parm)
{
return true;
}

我已经尝试过这个方法,看看它是否会刷新绑定(bind),但没有任何乐趣!

_viewModel.CreateCommand.RaiseCanExecuteChanged();

我认为问题在于用户控件以及我如何将命令作为属性传递,但不确定......

最佳答案

从外观上看,您在 View 模型上有一个依赖属性。如果您确实使用 MVVM,那绝对不是正确的方法(不是因为宗教上对模式的坚持,而是因为它不是最佳方法)。

首先,你的 View 模型是 DependencyObject 吗?

如果是,您应该将其降级为实现 INotifyPropertyChanged 的​​类。为什么?因为 Button 的 Command 属性本身就是一个 DependencyProperty(继承自 ButtonBase)并且已经支持数据绑定(bind)。

如果不是,那么它的依赖属性将不起作用,这很好,因为您的 View 模型一开始就不应该有依赖属性。

您应该做的是将 View 模型作为您的控件的 DataContext(我猜您已经进行了设置)。然后将 View 模型的 CreateCommand 更改为普通 ICommand,并像这样绑定(bind) createButton 的 Command 属性(采用默认的 StandardButtonStrip 样式)

<Button Name="createButton" HorizontalAlignment="Stretch" Command="{Binding CreateCommand}" />

这样,它仍然是可重用的,您只需要确保与用户控件关联的任何 View 模型都有一个 ICommand 类型的属性 CreateCommand(并且默认情况下该 View 模型将继承到按钮控件 - wpf 人员想到的最好的事情之一)。

所以回顾一下,您应该或多或少地以相反的方式进行操作。

希望这对您有帮助,干杯。

关于WPF - 从 UserControl 发出命令时 CanExecute 不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1136639/

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