【发布时间】: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 方法必须是“静态”的,我无法在该方法中访问 cmdSave。
现在我真的被困住了。有什么帮助吗?
DS
【问题讨论】:
-
好吧……这很尴尬。在静态回调方法中访问 cmdSave 上的 IsEnabled 属性非常简单... public static void OnIsSaveEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { ((ctlToolbarEdit)d).cmdSave.IsEnabled = (bool)e.NewValue; }