在WPF用户控件上实现IsEnabled属性

时间:2012-04-19 13:53:09

标签: c# wpf mvvm isenabled

我已经构建了一个用户控件(ctlToolbarEdit),上面有一些按钮 - 但为了简单起见,我们假设有一个按钮:cmdSave。

我希望ctlToolbarEdit公开一个IsSaveEnabled属性,当设置为true时,设置cmdSave.IsEnabled = true,并且(显然)当false设置cmdSave.IsEnabled = false时。

最后,我希望能够绑定到该属性..我想将IsSaveEnabled绑定到View Model的IsValid属性,托管控件的表单绑定到

因此。以下是ctlToolbarEdit

背后的代码
    private readonly DependencyProperty IsSaveEnabledProperty = DependencyProperty.Register("IsSaveEnabled", typeof(bool), typeof(ctlToolbarEdit));

    public ctlToolbarEdit()
    {
        InitializeComponent();
    }

    public bool IsSaveEnabled
    {
        get { return (bool)GetValue(IsSaveEnabledProperty); }
        set 
        {   
            SetValue(IsSaveEnabledProperty, value);
            cmdSave.IsEnabled = value;
        }
    }

以下是托管此用户控件的表单的XAML:

<ctl:ctlToolbarEdit IsSaveEnabled="{Binding IsValid}" />

作为测试,我还将这行XAML添加到托管ctlToolbarEdit的表单中(因此它正在复制我尝试生成的行为):

<Button Name="cmdSaveTest" Content="Save" IsEnabled="{Binding IsValid}" />

我的结果如下:

  • 我添加的按钮按预期工作。每当IsValid属性发生更改时,cmdSaveTest按钮的IsEnabled值都会更改(我可以看到它启用/禁用)。这告诉我IsValid属性正在正常触发...换句话说我可以绑定到该属性,所以我很高兴绑定到该属性和视图模型都没关系。

  • ctlToolbarEdit中的cmdSave按钮不执行任何操作。

事实上:我在ctlToolbarEdit中对属性的getter和setter设置了一些断点,这些断点似乎永远不会触发。

有谁能告诉我,我忽略了哪些令人痛苦的显而易见的事情?

修改

典型。你花了几个小时搜索,最后硬着头皮并在Stack Overflow上发帖,几乎立即找到了回答你问题的东西。

我现在知道了:

  • CLR会忽略我的属性getter和setter;它直接调用GetValue和SetValue。这就是为什么我的断点没有得到尊重(代码实际上没有被解雇!)以及为什么cmdSave的IsEnabled属性不起作用。

所以:所有人都说......我如何实现我想达到的目标呢?非常感谢。

修改

好的......进步更多;我看到你使用PropertyMetadata。我补充说:

, new PropertyMetadata(new PropertyChangedCallback(OnIsSaveEnabledChanged))

到IsSaveEnabledProperty DependencyProperty语句(制作它:

private readonly DependencyProperty IsSaveEnabledProperty = DependencyProperty.Register("IsSaveEnabled", typeof(bool), typeof(ctlToolbarEdit), new PropertyMetadata(new PropertyChangedCallback(OnIsSaveEnabledChanged)));

但是现在我需要编写的OnIsSaveEnabledChanged方法必须是“静态的”,而且我无法在该方法中使用cmdSave。

现在我真的被卡住了。有什么帮助吗?

DS

1 个答案:

答案 0 :(得分:2)

使用典型的MVVM模式,您可以反过来执行此操作:您的命令的CanExecute / IsEnabled属性将控制控件上的IsEnabled属性。因此,当您的viewmodel确定保存不可用时,它将导致您的命令的CanExecute / IsEnabled标志为false,并且使用该命令的任何控件都将自行禁用。例如,看一下Button控件如何与ICommand一起使用。

http://msdn.microsoft.com/en-us/library/ms752308.aspx

http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx#sec10