2016-02-16 64 views
2

當我發現以下行爲時,我正在Winforms中實施/試驗Databindings和INotifyPropertyChanged。Control.Databindings意外的行爲與Poco-Viewmodel

來自Textbox1.Text的綁定魔法作品< - > Vm.Foo < - > Textbox2.Text(也是另一種方式)。但是,當我通過button.Click事件直接更改Vm.Foo它不起作用。

這裏發生了什麼?看來Control.Databindings也在我的Poco.Foo上引發了ChangedEvent。但是如何?我是否也可以手動執行此操作,而無需實施INotifyPropertyChangedim我的虛擬機?

爲了這個例子的意圖,我的Viewmodel是一個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); 
    } 
} 

回答

0

added data bindings的PropertyChanged你的文本框事件和更新Vm.Foo因爲Control.Text是已經改變,引發事件的性質。不是VM.Foo。爲了提高您VM.Foo一個的PropertyChanged事件沒有實現INotifyPropertyChanged的嘗試Update Controls for Winforms

+0

你有一個錯誤的觀點。 如果textBox1.Text被修改PropertyChanged爲此屬性引發,然後傳播到不引發PropertyChanged的Vm.Foo。但仍然textBox2.Text更改。 – jens