WPF:运行 更改 DependencyProperty 时的代码
WPF: Run Code when DependencyProperty Is Changed
在一个简单的用户控件中,我希望能够在依赖项 属性 更改时随时 运行 编码。
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 的包装器,它通常被绕过,除非你直接在代码后面 get/set 属性。要在 属性 更改时处理某些事情,您需要提供一个 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 属性 包装器
一个解决方案是 运行 当 属性 改变时触发。查看 this MSDN article 了解更多信息、选项和示例。
在一个简单的用户控件中,我希望能够在依赖项 属性 更改时随时 运行 编码。
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 的包装器,它通常被绕过,除非你直接在代码后面 get/set 属性。要在 属性 更改时处理某些事情,您需要提供一个 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 提到的是什么您拥有的只是
一个解决方案是 运行 当 属性 改变时触发。查看 this MSDN article 了解更多信息、选项和示例。