绑定破坏Mode = OneWay直接赋值给DependencyProperty

问题描述:

我有一段非常简单的代码来理解当我们将Binding表达式赋值给任何依赖属性时会发生什么,然后为该依赖赋值直接值属性。以下是代码绑定破坏Mode = OneWay直接赋值给DependencyProperty

查看XAML

<StackPanel> 
    <Button Click="Button_Click" Content="Assign binding value" /> 
    <Button Click="Button_Click_1" Content="Assign direct value" /> 
    <TextBox Text="{Binding TextSource, Mode=OneWay}" x:Name="stf" /> 
</StackPanel> 

查看XAML.cs

public partial class MainWindow : Window 
{ 
    MainViewViewModel vm = new MainViewViewModel(); 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = vm; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     vm.TextSource = "Value set using binding"; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     stf.Text = "New direct value"; 
    } 
} 

视图模型

public class MainViewViewModel : INotifyPropertyChanged 
{ 
    //INotifypropertychanged implementation here ... 

    private string _textSource; 

    public string TextSource 
    { 
     get { return _textSource; } 
     set 
     { 
      _textSource = value; 
      OnPropertyChanged("TextSource"); 
     } 
    } 

} 

现在我的观察是

  1. 当我点击“分配绑定值”时,视图被更新为绑定源值。 (正如预期的那样
  2. 当我点击“分配直接价值”的观点与分配给文本字段(正如预期的那样)直接值更新
  3. 我认为在这个阶段,结合被打破,当我再次点击“分配绑定值”它不应该工作,意味着没有UI更新。并根据我的预期工作(与预期的一样
  4. 令人困惑的是,当我将绑定模式设置为“双向”,然后点3没有发生,并且它始终保持工作,无论我按哪个按钮。无论从约束力来源还是直接价值。 (我不清楚TwoWay绑定需要用这个做什么

有人请澄清一下吗?

设置DependencyProperty值时,DependencyObject检查新值是否为BindingExpression。如果不是,它会检查以前的值是否是绑定表达式。对于之前的绑定表达式,它会尝试设置表达式的值。尝试设置值时BindingExpression检查模式,而对于OneWay,它将返回false而不设置值,并停用和分离依赖项属性的绑定表达式。因此,对于Mode=OnWay,绑定会取消激活并为依赖项属性分离。

对于TwoWay,由于BindingExpression能够设置该值,因此绑定不会被停用并继续工作。

+0

感谢您的回答,您能否让我知道一些参考文档链接,以便我可以详细阅读它?此外,如果我们在自定义控件中拥有自定义依赖项属性,那么我们有责任在'DependencyPropertyChanged'事件中执行这些检查,还是在此之前完成? –

+1

不幸的是,没有这样的引用,但是您可以反思DependencyObject SetValue函数以查看设置DP值所需的所有步骤。不,您不必担心这些检查,因为这些检查将由DependencyObject基类关注。 – Nitin

我认为TwoWay结合将在视图模型的属性的值,如果你在任何时候改变依赖属性的值(当你按下像分配到UI元素,的依赖属性,也按钮“分配直接值”),则依赖项属性的新值也将被分配给视图模型中的属性。

换句话说,我认为TowWay模式实际上意味着该值可以从视图模型分配给用户界面,从用户界面分配给视图模型。

+0

确实是双向绑定是针对两个方向的,但是为什么OneWay绑定源 - >目标更新在我为'TextField.Text'指定直接值时不起作用。在这两种情况下,我都在测试source-> target。 –

+0

如果我理解正确,我认为你在原文中说的是真实的,当给TextField.Text赋值时,绑定会被破坏(尽管我从未见过这种东西)。说实话,我将不得不亲自测试这个场景,以便更多地讨论它。对不起,如果我没有太大的帮助。 – Agustin0987