3

私が取り組んでいるプロジェクトに役立つと信じているので、BindingList についてもっと学ぼうとしています。

現在、ネイティブ .Net オブジェクト (Image) をサブタイプ化するクラス (HashedImage) のサブタイプであるオブジェクト クラス (ScannedImage) があります。2 つのサブタイプを一緒に移動できなかった理由はありません。以前に構築したオブジェクトを単純にサブタイプ化していますが、今度は ScannedImage オブジェクトを RDB に保存します (技術的にではなく、詳細とおそらくサムネイルのみ)。

また、オブジェクト クラスには、独自のカスタム型 (キーワード) であるメンバー型があります。これらのオブジェクトを表示するためにカスタム datagridview を使用していますが、ScannedImage オブジェクトへのすべての変更を独自のコードで処理しています。ご想像のとおり、これらの基本型で発生する処理するイベントがかなりあります。

では、INotifyPropertyChanged を実装するようにオブジェクトを変更した場合、オブジェクト コレクション (BindingList を実装) は ScannedImage オブジェクトへの変更の通知を受け取りますか?

また、Keywords が INotifyPropertyChanged を実装した場合、変更は ScannedImage オブジェクトを通じて BindingList にアクセスできますか?

これがかなり新しいように思われる場合は申し訳ありません。BindingList を発見したのはつい最近のことで、C# プログラミングの正式なトレーニングを受けていません。これを進めるのに苦労しています。

また、誰か良い参考資料があれば、リンクをいただければ幸いです。明らかに、私は MSDN ライブラリを熟読しました。ウェブ上でいくつかの良いリンクを見つけましたが、多くの人が現在 WPF と ObservableCollection を使用しているようです。

私のプロジェクトは、Winforms と .Net3.5 フレームワークに基づいています。

ティア

4

1 に答える 1

1

私はあなたの両方の質問に答えます:

[I] INotifyPropertyChanged を実装するようにオブジェクトを変更した場合、オブジェクト コレクション (BindingList を実装) は ScannedImage オブジェクトへの変更の通知を受け取りますか?

実際にBindingList<T>内でクラスを使用する場合System.ComponentModel、 を実行する要素の特別なケースのコードが含まれていますINotifyPropertyChanged。リストプロパティの変更が表示され、通知が送信されます。

ただし、微妙に異なる「BindingListの実装」について具体的に尋ねます。クラスを実装することはできません。ただし、独自のクラスで実装できるインターフェイス があります。IBindingListこれを選択した場合は、リスト クラスを作成するときに、プロパティの変更通知を確実に監視する必要があります。

IBindingList通常、独自の実装を作成する必要はありません。BindingList<T>既存のリストをラップするために使用するだけで問題ありません。

また、Keywords が INotifyPropertyChanged を実装した場合、変更は ScannedImage オブジェクトを介して BindingList にアクセスできますか?

いいえ彼らはしません。 リスト内の特定BindingList<T>のオブジェクトのみを参照し、すべての依存関係をスキャンしてグラフ内のすべてを監視する機能はありません (可能であれば、常に良い考えではありません)。

通知を受け取りたい場合は、オブジェクトScannedImageからのプロパティ変更通知をチェックするようにクラスを更新しKeywords、それに応じて独自のPropertyChangedイベントを発生させる必要があります。

例:

public class ScannedImage : INotifyPropertyChanged
{
    private Keywords keywords;

    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            PropertyChangedEventArgs e = new 
                PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

    private void KeywordsChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged("Keywords");
    }

    private void SetKeywords(Keywords newKeywords)
    {
        Keywords oldKeywords = this.keywords;
        this.keywords = null;
        if (oldKeywords != null)
            oldKeywords.PropertyChanged -= KeywordsChanged;
        this.keywords = newKeywords;
        if (newKeywords != null)
            newKeywords.PropertyChanged += KeywordsChanged;
    }

    public Keywords Keywords
    {
        get { return keywords; }
        set { SetKeywords(value); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

public class Keywords : INotfifyPropertyChanged { ... }

ここで行われていることを理解していただければ幸いです。所有者 は、イベントを内部クラスからScannedImage自動的にフックし、 が変更されたことを示す別のプロパティ変更イベントを発生させます。このようにして、バインド リストやその他のデータ バインディング コントロールは、キーワードが変更されたときに通知を受け取ります。PropertyChangedKeywordsKeywords

于 2010-05-09T22:19:16.787 に答える