2015-11-20 51 views
2

在MSDN文檔中,我發現了一些文章,它們說將兩個對象綁定到一起並不會有任何問題。所以我試着用WindowsForms應用程序。第一個對象是一個TextBox,第二個目標是下面的類的實例:雙向綁定C#。文本框和自制類的對象

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.ComponentModel; 

namespace WindowsFormsApplication1 
{ 

public class XmlEmulator : INotifyPropertyChanged 
{ 
    private string Captionfield; 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged() 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("")); 
    } 

    public string Caption 
    { 
     get 
     { 
      return this.Captionfield; 
     } 
     set 
     { 
      this.Captionfield = value; 
      NotifyPropertyChanged(); 
     } 
    } 
} 
} 

綁定TextBoxXmlEmulator.Captionfield工作正常,但我怎麼能綁定Captionfield oroperty到TextBox.text財產? XmlEmulator類是否必須繼承System.Windows.Forms.Control才能獲得Databindings屬性?在這種情況下,我遇到了麻煩,因爲我已經實現了INotifyPropertyChanged接口。

我該如何解決這個問題?

+0

確保您綁定Caption屬性而不是Captionfield,因爲Captionfield是私有的。 –

回答

0

在MSDN文檔中,我發現了一些文章,它們說將兩個對象綁定到對方是沒有任何問題的。

這是不正確的,一個一個的對象必須是Control,而另一個可以是任何對象(包括Control)。綁定到控件屬性時,可以指定綁定是「單向」還是「雙向」,以及何時通過Binding.DataSourceUpdateMode PropertyBinding.ControlUpdateMode Property更新一個或另一個端。我猜你的結合已經是「雙向」如果你已經使用了標準像這樣的代碼

XmlEmulator emulator = ...; 
TextBox textBox = ....; 
textBox.DataBindings.Add("Text", emulator, "Caption"); 

,如果你修改的文本框中,模擬器屬性將更新。請注意,DataSourceUpdateMode屬性的默認值爲OnValidation,因此模擬器將在您離開文本框後進行更新。如果你想在您鍵入其立即發生,那麼你需要一套是OnPropertyChanged通過修改上面的代碼是這樣

textBox.DataBindings.Add("Text", emulator, "Caption", true, DataSourceUpdateMode.OnPropertyChanged); 

事實上Add方法返回一個Binding對象,所以你可以使用這樣的

var binding = textBox.DataBindings.Add("Text", emulator, "Caption"); 

並探索/修改綁定屬性。