我有一个从装饰器继承的类的依赖属性,如下所示:
public class LoadingAdorner : Adorner
{
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof (string), typeof (LoadingAdorner), new PropertyMetadata(default(string)));
public string Text
{
get { return (string) GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
public static readonly DependencyProperty IsShowingProperty = DependencyProperty.Register("IsShowing", typeof (bool), typeof (LoadingAdorner), new PropertyMetadata(default(bool)));
...
}
装饰器实际上没有任何 XAML,但我希望此装饰器的文本可绑定到视图模型。所以我在代码中创建绑定,在视图的构造函数中,如下所示:
private readonly LoadingAdorner _loading;
public MainWindow()
{
InitializeComponent();
_loading = new LoadingAdorner(MainPage);
var bind = new Binding("LoadingText"){Source = DataContext};
_loading.SetBinding(LoadingAdorner.TextProperty, bind);
}
DataContext 是我的视图模型,我的视图模型实现了 INotifyPropertyChanged,LoadingText 是一个调用 OnPropertyChanged 的字符串属性等。XAML 中的所有绑定都可以正常工作,但是代码绑定不能。
我相信是因为在创建绑定的时候,视图模型还没有被设置为DataContext(它是null),我在创建视图之后就行了。如果我使用 Source = this 将此绑定设置为视图上的属性,则它可以工作。
我的问题是,为什么 XAML 绑定能够对源对象的变化做出反应,而代码绑定似乎没有?我是否有合适的方法来创建一个绑定,该绑定将对此类似于 XAML 绑定作出反应?