WPF:在更改依赖项属性时运行代码
本文关键字:属性 运行 代码 依赖 WPF | 更新日期: 2023-09-27 18:18:28
在一个简单的用户控件中,我希望能够在依赖项属性更改时随时运行代码。
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 上的另一个属性。
运行此函数时,永远不会到达该函数。 如何让代码在每次更改依赖项属性时运行?
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");
}
@King的回答很好,我想补充一些你应该知道的信息:
-
如果您只想按 DP 备份属性并提供默认值值,使用
PropertyMetadata
,-
如果要指定动画行为,请使用
UIPropertyMetadata
, -
但是如果某些属性影响WPF框架级别的东西,例如元素布局、父布局或数据绑定,请使用
FrameworkPropertyMetadata
。
-
可以在 msdn http://msdn.microsoft.com/en-us/library/ms751554.aspx 上查看的详细信息
在
实现属性以使用依赖属性注册时,抵制将 set 访问器用于逻辑的诱惑!
换句话说,只有在过程代码中设置了属性时,才会调用set
访问器。使用 XAML 设置属性、数据绑定等时,WPF 直接调用SetValue
。这就是为什么没有达到该功能的原因...这就是为什么King King在上面的答案中提到你所拥有的只是一个.NET属性包装器。
解决方案可能是在属性更改时运行触发器。有关详细信息、选项和示例,请查看此 MSDN 文章。