Control.Databindings 意外行为与 Poco-Viewmodel.

本文关键字:Poco-Viewmodel Databindings 意外 Control | 更新日期: 2023-09-27 18:34:54

当我发现以下行为时,我在Winforms中实现/试验Databindings和INotifyPropertyChanged

绑定魔法从 Textbox1.Text <-> Vm.Foo <-> Textbox2.Text (也是另一种方式(开始工作。但是当我直接通过按钮更改 Vm.Foo 时。点击事件它不起作用。

这是怎么回事?似乎Control.Databindings在我的Poco.Foo上也引发了一个ChangedEvent。但是怎么做呢?我也可以在不实施 INotifyPropertyChangedim 我的 VM 的情况下手动执行此操作吗?

为了这个例子,我的视图模型是一个Poco,而不是实现INotifyPropertyChanged。

class Form2 : Form
{
    private TextBox textBox1;
    private TextBox textBox2;
    public Poco Vm = new Poco();
    private Button btn;
    public class Poco
    {
        public string Foo { get; set; }
    }
    public Form2()
    {
        textBox1 = new TextBox();
        textBox2 = new TextBox();
        btn = new Button();
        textBox1.Location = new System.Drawing.Point(10, 10);
        textBox2.Location = new System.Drawing.Point(10, 40);
        btn.Location = new System.Drawing.Point(10, 70);
        btn.Text = "btn";
        this.Controls.Add(textBox1);
        this.Controls.Add(textBox2);
        this.Controls.Add(btn);
        btn.Click += (sender, args) =>
        {
            Vm.Foo += "#";
        };
        this.textBox1.DataBindings.Add(nameof(Control.Text), Vm, nameof(Vm.Foo), false, DataSourceUpdateMode.OnPropertyChanged);
        this.textBox2.DataBindings.Add(nameof(Control.Text), Vm, nameof(Vm.Foo), false, DataSourceUpdateMode.OnPropertyChanged);
    }
}

Control.Databindings 意外行为与 Poco-Viewmodel.

添加的数据绑定会在文本框上引发 PropertyChanged 事件并更新 Vm.Foo,因为 Control.Text 是已更改并引发事件的属性。不是VM.Foo。要在 VM.Foo 上引发 PropertyChanged 事件而不实现 INotifyPropertyChanged 尝试更新 Winforms 的控件