我已经构建了一个用户控件(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 方法必须是“静态的”,并且我无法在该方法中访问 cmdSave。
现在我真的被困住了。有什么帮助吗?
DS