对于DependencyProperty的直接值赋值,Mode = OneWay的绑定已断开

时间:2016-04-15 05:58:25

标签: wpf mvvm binding dependency-properties

我有一段非常简单的代码来理解当我们将Binding表达式分配给任何依赖项属性然后为该依赖项属性分配直接值时会发生什么的行为。以下是代码

查看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. 当我点击&#34;分配绑定值&#34;视图使用绑定源值更新。 (按预期
  2. 当我点击&#34;分配直接值&#34;视图将使用分配给文本字段的直接值进行更新(按预期
  3. 我认为在这个阶段,绑定被破坏,当我点击&#34;分配绑定值&#34;再次它不应该工作,意味着没有UI更新。它符合我的期望(如预期
  4. 令人困惑的一点是,当我将绑定模式设置为&#34; TwoWay&#34;时,则没有发生第3点,并且它始终保持按下我按下的任何按钮。来自绑定源和直接值。 (我不清楚TwoWay绑定需要做什么
  5. 有人请澄清一下吗?

2 个答案:

答案 0 :(得分:2)

我认为TwoWay绑定会将视图模型中属性的值分配给UI元素的依赖项属性,以及如果您在任何时候更改值的值依赖属性(例如,当您按下按钮&#34;分配直接值&#34;)然后依赖属性的新值也将分配给视图模型中的属性。

换句话说,我认为TowWay模式实际上意味着可以将值从视图模型分配到UI,从UI分配到视图模型。

答案 1 :(得分:2)

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

对于TwoWay,由于BindingExpression能够设置值,因此绑定不会停用并继续有效。