在一个简单的用户控件中,我希望能够在依赖项属性发生更改时运行代码。
public static readonly DependencyProperty Text1Property =
DependencyProperty.Register("Text1", typeof(string),
typeof(BasicControl));
public string Text1
{
get { return GetValue(Text1Property).ToString(); }
set
{
SetValue(Text1Property, value.ToString());
OnPropertyChanged("Text2");
}
}
在这种情况下,Text2是另一个从Text1派生并显示在UI上的属性。
运行此功能时,永远不会到达该功能。如何在每次更改依赖项属性时运行代码?
答案 0 :(得分:2)
Clr属性只是DependencyProperty的包装器,除非你直接在代码后面获取/设置属性,否则它通常被旁路。要在属性更改时处理某些内容,您需要提供包含某些属性更改回调的PropertyMetadata
,如下所示:
public static readonly DependencyProperty Text1Property =
DependencyProperty.Register("Text1", typeof(string),
typeof(BasicControl), new PropertyMetadata(text1Changed));
//the text1Changed callback
static void text1Changed(DependencyObject o, DependencyPropertyChangedEventArgs e){
var bc = o as BasicControl;
if(bc != null) bc.OnPropertyChanged("Text2");
}
答案 1 :(得分:2)
@ King的答案很好,我想补充一些你应该知道的信息:
如果您只想通过dp支持属性并提供默认值
值,使用PropertyMetadata
,
如果要指定动画行为,请使用UIPropertyMetadata
,
但是如果某些属性影响wpf框架级别的东西,例如元素
布局,父布局或数据绑定,使用FrameworkPropertyMetadata
。
您可以在msdn http://msdn.microsoft.com/en-us/library/ms751554.aspx
上查看详细信息答案 2 :(得分:1)
在实现属性以使用依赖项属性注册时,抵制使用set accessor for logic的诱惑!
换句话说,如果在过程代码中设置了属性,则仅调用set
访问器。当使用XAML,数据绑定等设置属性时,WPF直接调用SetValue
。这就是为什么函数没有到达...这就是为什么King King提到你拥有的只是一个.NET属性的原因his answer above中的包装器。
解决方案可能是在更改属性时运行触发器。查看this MSDN article了解更多信息,选项和示例。