2

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

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

最后,我希望能够绑定到该属性.. 我想将 IsSaveEnabled 绑定到视图模型的 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 上发帖,几乎立刻就能找到可以回答你问题的东西。

我现在知道:

  • 我的属性 getter 和 setter 被 CLR 忽略;它直接调用 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 方法必须是“静态的”,并且我无法在该方法中访问 c​​mdSave。

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

DS

4

1 回答 1

2

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

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

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

于 2012-04-19T14:20:43.400 回答