0

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 フォームでは少し異なるのでしょうか? これは、実行時にバインドしているためですか?

4

1 に答える 1

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;

これで、次のように動的にバインドできます。

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

INotifyPropertyChanged をデータ オブジェクトに実装すると、期待どおりに動作します。WPF を使用する場合に不要な手順を 1 つ忘れました。

于 2009-10-12T21:27:40.380 に答える