【问题标题】:Implementing an IsEnabled property on a WPF User Control在 WPF 用户控件上实现 IsEnabled 属性
【发布时间】:2012-04-19 13:53:08
【问题描述】:

我已经构建了一个用户控件 (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 上发帖,然后几乎立即找到可以回答您问题的内容。

我现在知道了:

  • 我的属性 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

【问题讨论】:

  • 好吧……这很尴尬。在静态回调方法中访问 c​​mdSave 上的 IsEnabled 属性非常简单... public static void OnIsSaveEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((ctlToolbarEdit)d).cmdSave.IsEnabled = (bool)e.NewValue; }

标签: c# wpf mvvm isenabled


【解决方案1】:

对于典型的 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

【讨论】:

  • 嗯。实际上,这是有道理的。我会调查的。非常感谢。
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多