0

オブジェクト値をラベルにデータバインドしていますが、更新されません。

lblTime.DataBindings.Add(new Binding("Text", AppSettings.Instance.SelectedAuction, "EndDate", false, DataSourceUpdateMode.OnPropertyChanged));

バインドが機能し、メッセージボックスを使用すると、値が変化していることがわかります。INotifyChanged を正しく使用していますが、機能しません。個々の値を変更すると、次のように機能します。

AppSettings.Instance.SelectedAuction.EndDate = ((Auction)lbAuctions.SelectedItem).EndDate;

しかし、オブジェクト全体を置き換えたいのですが、更新されません:

AppSettings.Instance.SelectedAuction = (Auction)lbAuctions.SelectedItem;

どうしてこれなの?個々の値を更新できますが、オブジェクト自体は更新できません...

public Auction SelectedAuction
    {
        get { return this.selectedAuction; }
        set
        {
            this.CheckPropertyChanged<Auction>
            ("SelectedAuction", ref this.selectedAuction, ref value);
        }
    }

オブジェクト自体を置き換えるときに使用する別の方法、または参照する必要がある追加の方法があるということですか?

4

1 に答える 1

1

に設定されているデータ バインディングは、 への呼び出し時にlblTimeによってオブジェクト参照に設定されます。データバインディングは、そのオブジェクトのイベントをサブスクライブします。を変更しても、それは変わりません。データ バインディングは、元のオブジェクトで引き続きサブスクライブされます。(これは、データバインディングが元の を参照するため、メモリリードがあることも意味します。そのインスタンスはガベージコレクションされません)AppSettings.Instance.SelectedAuctionAddBindingPropertyChangedSelectedAuctionInstanceCurrentAuction

Instance代わりに、オブジェクトのイベントを一覧表示できるようにデータ バインディングを設定する必要があります。バインディングを に設定する必要があり"CurrentAuction.EndDate"ます。これは直接には機能しませんが (* 以下の注を参照)、そのバインディングをサポートする中間に配置できるヘルパー オブジェクトBindingSourceがあります。以下に例を示します。

BindingSource bs = new BindingSource();
bs.DataSource = AppSettings.Instance;
lblTime.DataBindings.Add("Text", bs, "CurrentAuction.EndDate", false, 
      DataSourceUpdateMode.OnPropertyChanged);

注: BindingSource3.5 では a がなくても機能しますが、4.0 では機能しません。「データ バインディングは Windows フォームでネストされたプロパティをサポートしていますか?」を参照してください。

于 2013-01-13T03:01:05.233 に答える