2

次のように、汎用 List オブジェクトを保持する静的クラス (DataFormSubject) を取得しました。

private static List<DataForm> dataForms = new List<DataForm>();

このリストに依存する他のクラスには、リストが更新されたときに通知する必要があるため、次のようにカスタム イベントと、項目が追加または削除されたときにトリガーできる関連メソッドを作成しました。

    public delegate void DataFormsUpdatedHandler(object sender);
    public static event DataFormsUpdatedHandler DataFormsUpdatedEvent;

    public static void AddDataForm(DataForm df)
    {
        dataForms.Add(df);
        if (DataFormsUpdatedEvent != null)
            DataFormsUpdatedEvent(df);
    }

    public static void RemoveDataForm(DataForm df)
    {
        dataForms.Remove(df);
        if (DataFormsUpdatedEvent != null)
            DataFormsUpdatedEvent(df);
    }

List は、次のように、プロパティを介して静的クラスから利用できます。

   public static List<DataForm> DataForms
    {
        get { return dataForms; }
        //set { dataForms = value; }
    }

しかし、ここでの問題は、クライアントがプロパティにアクセスし、クラスに対して直接追加または削除を行うことで、更新イベントをバイパスできることです! 例えば

     DataFormSubject.DataForms.Add(new DataForm);

どうすればこれを防ぐことができますか、または私が望むものを達成するためのより良い方法はありますか? 理想的には、オブザーバーがサブスクライブできる List クラスの更新イベントが必要です。

4

3 に答える 3

5

BindingList<T>またはObservableCollection<T>; の使用を検討してください。これらは両方とも、標準的な方法で必要なことを行います。

サブクラス化によって興味深いことを行うことはできませんList<T>-メソッドは仮想ではありません。Collection<T>はより拡張できるように設計されていますが、この場合、必要なものはすべて (によってBindingList<T>) 提供されています。

特に、これは以下を提供します。

  • IBindingList (グリッドなど、多くの UI バインディング コンポーネントで使用)
  • ListChanged - 詳細な通知のためにコードをサブスクライブできます
于 2009-04-08T11:20:44.140 に答える
2

ObservableCollectionをそのような目的で使用することを検討したいと考えています。開始するには、この MSDN の記事を参照してください。

于 2009-04-08T11:21:33.000 に答える
0

静的クラスの IList を表示せず、Enumerable のみを表示します。

public static IEnumerable<DataForm> DataForms
{
    get { return dataForms; }
    //set { dataForms = value; }
}

このように、すべての変更はクラスを通じて行う必要があります

于 2009-04-08T11:24:31.090 に答える