0

EmployeeオブジェクトのobservableCollectionとしてEmployeeListがあります。

EmployeeオブジェクトにはSalaryがあります。

XAMLで従業員の平均給与などのいくつかの値を表示したいのですが、アイテムがリストに追加されたとき、または更新されたアイテムのいずれかで給与フィールドが変更されたときに、UIフィールドが自動的に更新されます。

これは、平均のプロパティを作成し、リスト内のコレクションChangedおよびProperyChangedハンドラーをリッスンすることで実現できます。

しかし、私はこれを行うための他のより良い方法があるはずだと確信しています。(AttachedPropertiesまたはIValueConverter / IMultiValueConverterを使用する場合と同様)

これに関して、私は以下の質問があります。

  1. アイテムのリスト/ObservableCollectionにIMultiValueConverterを使用することは可能ですか?アイテムがリストに追加されたとき、および特定のプロパティが変更されたときに、コンバーターを呼び出す必要がありますか?
4

1 に答える 1

1

特にMVVMの観点からは、プロパティを使用することは間違いなく進むべき道です。オッカムの剃刀を考えてみてください。基本的に、最も単純な解決策が通常は最善です。

これは確かに最もクリーンなソリューションであり、したがって最も保守しやすいソリューションです。さらに、これは最も拡張性があります(必要に応じて、さまざまな計算に新しいプロパティを簡単に追加できます)。

読み取り専用のプロパティを作成し、コレクションが変更されたときにそのプロパティの名前でPropertyChangedを呼び出すだけです(これはあなたが行っているように聞こえます)。

たとえば、次の「平均」プロパティは次のとおりです。

public Double Average   
{
    get { return mMyCollection.Average(); }
}

void mMyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    PropertyChanged(this, new PropertyChangedEventArgs("Average"));
}

アタッチされたプロパティは機能しません-子要素で親のプロパティを指定するためのものです。

ValueConvertersは理論的には機能しますが(おそらくリスト内の各アイテムとコレクション全体に含まれている必要があります)、実際には何も変換しておらず、既存のデータに基づいて追加のデータを提供しています。そのためには、あらゆる種類のテンプレートをいじくり回す必要があります。何かを変更する必要があるときはいつでも、それらをいじくり回す必要があります。それは急いで複雑になり、利益はありません。

于 2010-09-29T14:03:35.930 に答える