我偶尔会遇到一个问题。这是一个简单的例子:
Xaml代码:
<Window x:Class="WPFProperties.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
x:Name="root">
<Grid>
<TextBox Text="{Binding Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,ElementName=root}"/>
</Grid>
</Window>
代码背后:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
//// Using a DependencyProperty as the backing store for Text. This enables animation, styling, binding, etc...
//public static readonly DependencyProperty TextProperty =
// DependencyProperty.Register("Text", typeof(string), typeof(MainWindow), new UIPropertyMetadata(null));
private string _text;
public string Text
{
get { return _text; }
set
{
if (this._text == value) return;
_text = value;
this.DoSomething();
}
}
private void DoSomething()
{
// Do Someting
}
}
在文本框中键入时,可以调用DoSomething()方法。但是,一旦我取消注释依赖属性“Text”,它就永远不会被调用。
注意:我知道依赖属性的基本用法。
答案 0 :(得分:2)
你需要用回调创建UIPropertyMetaData(PropertyChangedCallback propertyChangedCallback),它应该是静态方法,你应该在其中调用传递的DependancyObject上的update属性
示例在此解释:MSDN
答案 1 :(得分:2)
AFAIK这里没有发生正常的属性声明,因为当DP被声明为static
时,它会在创建正常对象之前就开始初始化,并且它具有优先权。
因此,类中的属性只被视为普通的DP帮助器属性,而不是看起来像新的类成员属性。因此,绑定内部仅使用内部SetValue(...)
或GetValue(...)
直接绕过您的覆盖,这是DP的正常行为。
如果没有声明DP,那么这将成为该类的正常属性,并且我们会看到您的DoSomething()
被调用。
如果我们在MainWindow的构造函数中调用Text = "Anything"
,即使DP定义没有被注释,我们也可以看到DoDomething()
被调用,因为这就是DP调用本地帮助器的方式。只是绑定使用基本定义的