2009-10-09 3 views
0

DataRepeater를 사용하여 비즈니스 개체의 데이터를 화면에 표시하고 있습니다. 이 작업을 수행하는 C#에서 Windows 폼을 사용하고 있습니다. 데이터 소스는 컴파일 타임에 사용할 수 없으므로 런타임에 데이터 소스를 바인딩하려고합니다.DataRepeater (Microsoft.VisualBasic.PowerPacks)를 동적으로 바인딩합니다.

다음은 단순화 된 시나리오입니다. 이 비즈니스 클래스를 사용하고 있습니다.

public class Product 
{ 

    private double _price; 
    public double Price 
    { 
     get 
     { 
      return _price; 
     } 
     set 
     { 
      _price = value; 
     } 
    } 
} 

VisualStudio 인터페이스로 ProductDataSource를 만들고 가격을 레이블에 바인딩했습니다. 지금은 코드 내 중계기의 데이터 소스를 작성 :

dataRepeater1.DataSource = _productDataAgent.GetProducts(); 

내 응용 프로그램을 시동 할 때 가격은 정확하게 라벨에 채워진다. 여태까지는 그런대로 잘됐다.

이제 제품을 업데이트 할 때 가격 레이블을 업데이트하고 싶습니다. Visual Studio 인터페이스가 나를 돕고 '데이터 소스 업데이트 모드'를 선택하게합니다. 그래서 "OnPropertyChanged"를 선택합니다.

여기 까다로운 부분이 있습니다. .NET 런타임은 price 속성이 백엔드에서 업데이트되었음을 ​​어떻게 알 수 있습니까? 따라서 비즈니스 클래스를 수정하여 INotifyPropertyChanged를 구현합니다. 좋아요 :

public class Product : INotifyPropertyChanged 
{ 
    private double _price; 

    public double Price 
    { 
     get 
     { 
      return _price; 
     } 
     set 
     { 
      _price = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("Price")); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

문제는 작동하지 않습니다. 제품을 업데이트 할 때 인터페이스에서 다시 업데이트되지 않습니다. 디버깅하고 속성을 변경할 때 PropertyChanged 이벤트가 null이므로 아무도 듣고 있지 않습니다.

PropertyNameChanged라는 이름의 이벤트 : 문제에에 좀 더 깊이 탐구

나는 MSDN에 System.Windows.Forms.Binding 생성자 페이지에서 다음을 발견했다.

그래서 (Custom) PriceChanged 이벤트를 사용했지만 작동하지 않았습니다.

여기 뭔가 잘못 되었나요? WPF를 사용하고 있습니다. Windows Forms에서 조금 다른 점이 있습니까? 이것은 런타임에 바인딩되기 때문에입니까?

답변

0

Jep가 해결책을 찾았습니다. 분명히 당신은 단순히 제품 목록에 바인딩 할 수 없습니다. 처음에는 제품을 볼 수 있지만 속성이 변경되면 업데이트되지 않습니다. 대신 BindingSource에 정적으로 바인딩해야합니다. Visual Studio (데이터 메뉴에 있음)를 사용하여 객체 데이터 소스를 생성하면됩니다. 다음과 같은 코드가 생성됩니다

private System.Windows.Forms.BindingSource beursProductDisplayBindingSource; 
this.beursProductDisplayBindingSource = new System.Windows.Forms.BindingSource(this.components); 
this.dataRepeater1.DataSource = this.beursProductDisplayBindingSource; 

지금 당신이 동적으로 다음과 같이 바인딩 할 수 있습니다 : 내가했던 것처럼 데이터 개체에서 INotifyPropertyChanged를 구현할 때 예상처럼

BindingSource productBinding = ((BindingSource)dataRepeater1.DataSource); 
_productDataAgent.BeursProducts.ForEach(product => productBinding.Add(product)); 

지금 작품이다. WPF를 사용할 때 필요하지 않은 한 걸음 만 잊었습니다.

관련 문제