【问题标题】:Binding broken for Mode = OneWay on direct value assignment to DependencyPropertyMode = OneWay 直接赋值给 DependencyProperty 的绑定损坏
【发布时间】:2016-08-06 23:04:14
【问题描述】:

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

查看 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. 令人困惑的一点是,当我将绑定模式设置为“TwoWay”时,第 3 点没有发生,而且无论我按什么按钮,它都始终保持工作状态。来自绑定源和直接价值。 (我不清楚 TwoWay 绑定需要对此做什么

有人请解释一下吗?

【问题讨论】:

    标签: wpf mvvm binding dependency-properties


    【解决方案1】:

    在设置DependencyProperty 值时,DependencyObject 会检查新值是否为BindingExpression。如果不是,它检查先前的值是否是绑定表达式。对于先前的绑定表达式,它会尝试设置表达式的值。 BindingExpression 在尝试设置值时检查模式,对于 OneWay,它在不设置值的情况下返回 false,并停用和分离依赖属性的绑定表达式。因此,对于Mode=OnWay,绑定会因依赖属性而被停用和分离。

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

    【讨论】:

    • 感谢您的回答,能否请您告诉我一些参考文档链接,以便我详细阅读?此外,如果我们在自定义控件中有自定义依赖属性,是我们有责任在 DependencyPropertyChanged 事件中进行这些检查还是在此之前完成?
    • 遗憾的是没有这样的参考,但您可以反映 DependencyObject SetValue 函数以查看设置 DP 值所需的所有步骤。不,您不必担心这些检查,因为 DependencyObject 基类会为您处理这些检查。
    【解决方案2】:

    我认为TwoWay绑定会将视图模型中属性的值分配给UI元素的依赖属性,并且如果您在任何时候更改依赖项的值属性(例如当您按下“分配直接值”按钮时),则依赖属性的新值也将分配给视图模型中的属性。

    换句话说我认为TowWay模式实际上意味着可以将值从View Model分配给UI,也可以从UI分配给ViewModel。

    【讨论】:

    • 是的,确实双向绑定适用于两个方向,但是当我将直接值分配给TextField.Text 时,为什么单向绑定源-> 目标更新不起作用。在这两种情况下,我都在测试 source->target。
    • 如果我理解正确,我认为你在原帖中所说的是真的,当将直接值分配给TextField.Text 时,绑定会被破坏(尽管我从未见过这样的事情)。老实说,我必须自己测试这个场景才能讨论更多。对不起,如果我没有太多帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2019-01-22
    • 2011-04-29
    • 2019-06-04
    • 2012-08-26
    • 1970-01-01
    • 2010-09-18
    • 2012-01-30
    相关资源
    最近更新 更多