WPF - CanExecute从用户控件养命令时不到风度火(WPF - CanExecute

2019-09-19 04:29发布

我已经得到了我想要对我的大部分形式的按钮带用户控件。

我已经添加的命令如下...

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

我已经设置这些为依赖属性,所以我可以绑定到他们...

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

我然后我的用户绑定到一个命令

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

我设置了命令如下...

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

但尽管我是永远回我CanCreate方法真正的按钮是无效的......如果我把一个破发点上回真正的它永远不会触发!

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

我试过这个,看看它是否会刷新绑定,但没有喜悦!

_viewModel.CreateCommand.RaiseCanExecuteChanged();

我认为这个问题是下到用户的控制,以及如何我传递的命令,作为一个财产,但不知道...

任何人都可以帮忙吗?

干杯,

安迪

Answer 1:

这看起来的样子,你有一个视图模型依赖项属性。 如果你真的使用MVVM,这是definetly不去做的方式(不是宗教信念,因为一个模式,但因为它不是最佳的方式)。

首先,是你的视图模型为DependencyObject?

如果是,你应该把它降级到实现INotifyPropertyChanged的类。 为什么? 因为按钮的命令属性是一个DependencyProperty本身(自ButtonBase继承),并支持数据绑定了。

如果不是,那么就可以了依赖属性将无法正常工作,这是很好的,因为你不应该有摆在首位您的视图模型依赖属性。

你应该做的,是具有视图模型作为在DataContext为控制(我猜你已经有一个设置)。 然后更改您的视图模型的CreateCommand为纯ICommand的,和createButton的Command属性绑定像这样(在默认StandardButtonStrip风格)

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

这样,它仍然是可重复使用的,你只需要确保你与你的用户控件关联的任何视图模型类型的ICommand的属性CreateCommand(和视图模型将在默认情况下被继承下来的按钮控制 - 的一个最好的东西WPF家伙想出来)。

因此,要回顾一下,你应该这样做的其他方式,或多或少。

希望这是有益的,欢呼声。



Answer 2:

一个需要注意的接受的答案 -

使用委托命令我只能得到这个工作,如果我创建了一个新的

Command<T> : DelegateCommand<T>和迷上了命令管理器。

event EventHandler ICommand.CanExecuteChanged 
{ 
 add { CommandManager.RequerySuggested += value; }
 remove { CommandManager.RequerySuggested -= value; }
} 


Answer 3:

你有没有覆盖的任何用户控件的功能?

一个常见的问题是压倒一切的方法,而不调用基的实现。 举例来说,如果你已经覆盖OnContentChanged()而不调用base.OnContentChanged()您可能不小心supressed的的射击ContentChanged事件。



文章来源: WPF - CanExecute dosn't fire when raising Commands from a UserControl