DataRepeater を使用して、ビジネス オブジェクトからのデータを画面に表示しています。これを実現するために、C# で Windows フォームを使用しています。データソースはコンパイル時に利用できないため、実行時にデータソースをバインドしたいと考えています。
これが単純化されたシナリオです。私はこのビジネスクラスを使用しています:
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 であるため、誰もリッスンしていないことがわかります。
問題をもう少し深く掘り下げると、MSDN の System.Windows.Forms.Binding Constructor ページで次のことがわかりました。
PropertyNameChanged という名前のイベント。
そこで、(カスタム) PriceChanged イベントを使用してみましたが、うまくいきませんでした。
ここで何か間違ったことをしていますか?私は WPF を使用しているので、これは Windows フォームでは少し異なるのでしょうか? これは、実行時にバインドしているためですか?