項目のリストに IMultiValueConverter を使用することはできますか?
-
26-09-2019 - |
質問
EmployeeList を Employee オブジェクトの observableCollection として持っています。
Employee オブジェクトには Salary があります。
XAML で従業員の平均給与などのいくつかの値を表示したいのですが、項目がリストに追加されたとき、または更新された項目のいずれかで給与フィールドが変更されたときに、UI フィールドが自動的に更新される必要があります。
これは、average のプロパティを作成し、リスト内のコレクション Changed および ProperyChanged ハンドラーをリッスンすることで実現できます。
しかし、これを行うための他のより良い方法があるはずだと私は確信しています。(AttachedProperties または IValueConverter/IMultiValueConverter を使用するのと同様)
これに関して、以下のような疑問があります。
- 項目の List/ObservableCollection に IMultiValueConverter を使用することはできますか?コンバーターは、項目がリストに追加されたとき、および特定のプロパティが変更されたときに呼び出される必要がありますか?
解決
プロパティを使用するには、間違いなく、特にMVVMの観点から、移動するための方法です。 オッカムの剃刀のは、考えてみて:基本的には、最も簡単な解決策が最善です。
それは確かにきれいなソリューションですので、最も保守性。プラス、それはほとんどの拡張(あなたがしたい場合は、簡単に別の計算のための新しいプロパティを追加することができます)です。
あなたがISをやらなければならないことは、読み取り専用プロパティを作成し、呼び出しているプロパティの名前でのPropertyChangedとき(あなたがやっているように聞こえる)コレクションが変更ます。
たとえば、ここでは「平均」プロパティです。
public Double Average
{
get { return mMyCollection.Average(); }
}
void mMyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
PropertyChanged(this, new PropertyChangedEventArgs("Average"));
}
添付プロパティが動作しません - 彼らは子要素に親のプロパティを指定するためのものです。
。 あなたは、既存のデータに基づいて追加データを提供している、(彼らはおそらくリストの各項目のほか、コレクション全体でなければならないでしょうが)ValueConvertersは理論的には、動作しますが、あなたは本当に何を変換していません。それを行うには、テンプレートのすべての種類の周りにマックする必要があるだろう、とあなたが変更何に必要な時間は、あなたは再び彼らと周りにマックする必要があります。それは急いで複雑になり、無利益のためになります。