2010-08-11 4 views
6

나는 (매우) 간단한 데이터 바인딩 테스트를 만들기 위해 노력하고 있어요,하지만 난 예상대로 작동하지 않습니다 ... 말 나는 다음과 같은 클래스가 있습니다간단한 데이터 바인딩

// this class represents some kind of data producer 
public class DataSourceClass 
    { 
     public string Data { get; set; } 

     public DataSourceClass() 
     { } 
    } 


//this form holds the TextBox control as the Data consumer 
public partial class DatabindingTestForm : Form 
    { 
     public DataSourceClass ds { get; set; } 
     public DatabindingTestForm() 
     { 
      InitializeComponent(); 
      ds = new DataSourceClass(); 
      textBox.DataBindings.Add("Text", ds, "Data"); 
     } 

     private void checkBox_CheckedChanged(object sender, EventArgs e) 
     { 
      if (checkBox.Checked) 
       ds.Data = "CHECKED"; 
      else 
       ds.Data = "NOT CHECKED"; 
     } 
    } 

내가 추가하지 않은 디자이너 코드가 있지만 그곳과 폼에는 TextBox 객체와 CheckBox 객체가 있습니다. 이해할 수 있듯이 사용자가 CheckBox를 선택 취소 할 때 TextBox Text 속성을 변경하려고합니다. 그러나이 코드는 TextBox Text 속성을 업데이트하지 않습니다. 누군가 내가 무엇을 놓치고 있는지 설명해 주시겠습니까?

답변

7

Data 속성 값이 변경되면 WinForms에 알리는 방법이 필요합니다.

  • DataSourceClass에 이벤트를 추가 : 가장 간단한 방법은하는 중입니다 public event EventHandler DataChanged;
  • INotifyPropertyChanged을 구현 DataSourceClass을 확인합니다. 그러면 PropertyChanged 이벤트가 발생합니다.

어떤 방법 으로든 새 이벤트를 준비해야합니다. Data 속성을 자동 속성에서 비공개 필드 인 get 방법과 set 방법으로 변환해야합니다. Data 속성에 대한 getter 및 setter를 명시 적으로 설정하면 setter 내부에서 이벤트를 발생시킬 수 있습니다.

+0

주 아이디어가 누락되었습니다. 어쨌든 이벤트를 추가해야하는 경우 왜 데이터 바인딩을 사용해야합니까? 난 그냥 이벤트를 사용할 수 있습니다 (ControlBindingsCollection 필요 없음 ...) –

+0

예를 들어,이 간단한, 당신은 텍스트 상자를 직접 업데이 트하는 이벤트가있을 수 있습니다. 그러나 실제 응용 프로그램에서는 사용자 인터페이스 (텍스트 상자)와 별도로 데이터 모델 (사용자의'DataSourceClass')을 유지하려고합니다. 데이터 바인딩의 목적은 모델과 UI 사이에 앉아서 서로를 인식 할 필요없이 데이터를 전달하는 것입니다. –

4

INotifyPropertyChanged 인터페이스를 사용할 수 있습니다. IDE/컴파일러를 통해 실행하지 않았으므로 구문 오류가 발생할 수 있습니다.

public class DataSourceClass : INotifyPropertyChanged 
{ 
    private string _data; 

    public string Data 
    { 
     get 
     { 
      return _data; 
     } 
     set 
     { 
      if(_data != value) 
      { 
       _data = value; 
       OnPropertyChanged("data"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if(handler != null) 
     { 
      handler(new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
관련 문제