我在继承自adorner的类上有依赖属性,如下所示:
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)));
...
}
Adorner并没有真正的XAML,但我希望这个adorner的文本可以绑定到viewmodel。所以我在视图的构造函数中创建了代码中的绑定,如下所示:
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绑定类似的响应?
答案 0 :(得分:1)
绑定没有,不能对源更改做出反应,这是逻辑上的不可能性,对象不更改属性并且引用到对象更改。绑定可以对DataContext
属性更改做出反应,但前提是不执行像Source = DataContext
那样可怕的操作,它通过仅获取当前数据上下文来杀死机制。只需删除它,以便DataContext
再次成为默认源,绑定应对更改做出反应。
如果DataContext
位于另一个对象而不是绑定的对象上,则需要将其移至Path
,即new Binding("DataContext.LoadingText"){ Source = this }
。