WPF-从用户控件引发命令时,CanExecute不会触发 [英] WPF - CanExecute doesn't fire when raising Commands from a UserControl

查看:341
本文介绍了WPF-从用户控件引发命令时,CanExecute不会触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在大多数表单上都有一个按钮条用户控件。

I've got a button strip usercontrol that I want to have on most of my forms.

我添加了以下命令... p>

I've added the commands as follows ...

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

我已将它们设置为依赖项属性,因此我可以绑定到它们...

I've set these as dependency properties so I can bind to them ...

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

然后将用户控件绑定到命令...

I'm then binding my usercontrol to a command ...

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

我正在如下设置命令...

I'm setting up the command as follows ...

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

但是尽管事实上我一直在我的C​​anCreate方法上返回true,但是按钮还是被禁用了。如果我在返回true处设置了一个断点,它将永远不会触发!

but despite the fact that i'm always returning true on my CanCreate method the button is disabled ... if I put a break point on return true it never fires!

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

我已经尝试过看看是否会刷新绑定,但是没有

I've tried this to see if it will refresh the binding, but no joy!

_viewModel.CreateCommand.RaiseCanExecuteChanged();

我认为问题出在用户控件上,我如何将命令作为属性,但不确定...

I think the problem is down to the user control and how I'm passing the Command up as a property, but not sure ...

推荐答案

这种外观看起来,您在视图模型上具有依赖项属性。如果您确实在使用MVVM,则绝对不是解决该问题的方法(不是因为宗教信仰某种模式,而是因为它不是最佳方法)。

The way this looks, you have a dependency property on a view model. If you are really using MVVM, that is definetly not the way to go about it (not because of religious adherence to a pattern, but because it's not the optimal way).

首先,您的视图模型是DependencyObject吗?

First of all, is your view model a DependencyObject?

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

If it is, you should downgrade it to a class which implements INotifyPropertyChanged. Why? Because the Button's Command property is a DependencyProperty itself (inherited from ButtonBase) and supports databinding already.

如果不是,则其依赖属性将不起作用,很好,因为您首先不应该在视图模型上具有依赖项属性。

If it isn't, then a dependency property on it will not work, which is fine, because you shouldn't have dependency properties on your view model in the first place.

您应该做的是,将视图模型作为DataContext用于您的控件(我想您已经设置好了)。然后将视图模型的CreateCommand更改为普通的ICommand,并像这样(使用默认的StandardButtonStrip样式)绑定createButton的Command属性

What you should do, is have the view model as the DataContext for your control (I'm guessing you already have that set up). Then change your view model's CreateCommand to a plain ICommand, and bind the createButton's Command property like this (in your default StandardButtonStrip style)

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

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

This way, it will still be reusable, you just need to ensure that any view model you associate with your user control has a property CreateCommand of type ICommand (and that view model will be inherited down to the button control by default - one of the nicest things the wpf guys thought up).

因此,回顾一下,您应该或多或少进行相反的操作。

So to recap, you should do it the other way around, more or less.

希望这会有所帮助,欢呼。

Hope this was helpful, cheers.

这篇关于WPF-从用户控件引发命令时,CanExecute不会触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆