2010-08-19 6 views
4

동적 속성을 WinForms 컨트롤 속성에 바인딩하고 싶습니다.동적 속성을 WinForms 컨트롤 속성에 바인딩 할 수 있습니까?

다음 예제에서는 스레드의 IsAlive 속성을 단추를 사용하도록 바인딩합니다.

using System; 
using System.Windows.Forms; 
using System.Threading; 

namespace ThreadTest 
{ 
    public partial class Form1 : Form 
    { 
    Thread thread; 

    public Form1() 
    { 
     InitializeComponent(); 

     thread = new Thread(() => 
     { 
      while (true) 
      Thread.Sleep(125); 
     } 
    ); 

     button2.DataBindings.Add("Enabled", thread, "IsAlive"); 
    } 

    private void buttonStart_Click(object sender, EventArgs e) 
    { 
     thread.Start(); 
    } 

    private void buttonStop_Click(object sender, EventArgs e) 
    { 
     // ... 
    } 
    } 
} 

이것은 시작시에만 작동합니다. 쓰레드가 살아 있지 않기 때문에 "Stop"버튼이 비활성화됩니다. "Start"버튼을 클릭하면 "Stop"버튼이 활성화되어있을 것으로 예상됩니다. 그러나 그렇지 않습니다.

내가 누락되었거나 그냥 가능하지 않습니까?

답변

3

스레드에는 INotifyPropertyChanged이 구현되어 있지 않으며 "IsAliveChanged"이벤트가 없으므로 데이터 바인딩에서 IsAlive가 변경되었음을 인식 할 수있는 방법이 없습니다.

This blog entry에는 WinForms에서 데이터 바인딩 작업을 수행하는 데 필요한 몇 가지 팁과 트릭이 있습니다. 주요 요구 사항은 바인딩하려는 클래스가 데이터 소스에서 컨트롤로의 동적 업데이트를 지원하려는 경우 데이터 바인딩을 염두에두고 설계해야한다는 것입니다.

1

WinForms의 데이터 바인딩은 자동으로 하나의 방식으로 만 작동하기 때문에 (UI를 변경할 때 개체가 업데이트 됨) 오히려 깨졌습니다. 바인딩에 사용 된 객체를 소유 한 경우 INotifyPropertyChanged 인터페이스를 구현해야합니다. 귀하의 경우에는 바인딩을 수동으로 재설정하여 작동되도록해야합니다 (바인딩이 실제로 아무 것도 제공하지 않음)

관련 문제