WPF中BindingOperations.GetBindingExpression返回null

3
我已经调整了一个被称为MyViewModel的ViewModel,使其从DependencyObject继承,并将其中一个名为Name的普通CLR属性改为DependencyProperty,它原来在setter内部触发了NotifyPropertyChanged()Name是一个双向绑定到TextBox上的,并且运行良好。
然而,调用BindingOperations.GetBindingExpression(InstantiatedMyViewModel, MyViewModel.NameProperty)总是返回null。
1 - 这是因为第一个参数不能传递我的ViewModel(InstantiatedMyViewModel),而应该传递文本框的实例吗?我假设由于它是一个双向绑定,所以InstantiatedMyViewModelTextBox都应该有一些绑定知识。
2 - 如果可能的话,我是否有什么遗漏?
它工作得非常好,但是当我尝试调用时:

1
我假设由于这是双向绑定,InstantiatedMyViewModel和TextBox都应该具有一些绑定知识。但这种假设是错误的。即使是双向绑定,你也无法从绑定源获取绑定表达式,只能从目标获取。 - Clemens
只是提醒一下,通常情况下,最好让您的ViewModel实现INPC接口而不是继承自“DependencyObject”。 - myermian
2个回答

5

你应该使用

  var name = InstantiatedMyViewModel.GetValue(MyViewModel.NameProperty)

BindingOperations.GetBindingExpression 用于控件与其他对象绑定的情况。例如:

  <TextBox x:Name="textBox1" Text="{Binding Name}" />

那么

  var bindingExpression = BindingOperations.GetBindingExpression(
     textBox1, TextBox.TextProperty);

  // "Name"
  var path = bindingExpression.ParentBinding.Path; 

3
我假设你在XAML中定义了TextBox的绑定——在这种情况下,文本框是绑定的目标,而你的视图模型是源——始终有一个绑定目标和一个绑定源,而BindingMode.TwoWay仅意味着该值会双向更新。话虽如此,你应该知道只有绑定的目标才具有关于绑定表达式的信息。
从MSDN上的BindingOperations.GetBindingExpression
返回与指定对象上的指定绑定目标属性相关联的BindingExpression对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接