Можно ли использовать IMultiValueConverter для списка элементов?
У меня есть EmployeeList как observableCollection объекта Employee.
Объект Employee имеет зарплату.
Я хочу отобразить несколько значений, таких как средняя зарплата сотрудников в XAML, и поле пользовательского интерфейса должно автоматически обновляться при добавлении элемента в список или при изменении поля зарплаты в любом из обновленных элементов.
Это может быть достигнуто путем создания свойства для среднего значения и прослушивания обработчиков коллекций Changed и ProperyChanged в списке.
Но я уверен, что должен быть какой-то другой лучший способ сделать это. (Например, используя AttachedProperties или IValueConverter / IMultiValueConverter)
В связи с этим у меня есть следующие вопросы.
- Можно ли использовать IMultiValueConverter для List/ObservableCollection элементов? Конвертер должен вызываться при добавлении элемента в список, а также при изменении определенного свойства?
1 ответ
Использование свойства - определенно способ, особенно с точки зрения MVVM. Вспомните бритву Оккама: в принципе, самое простое решение - обычно лучшее.
Это, безусловно, самое чистое решение и, следовательно, самое удобное в обслуживании. Кроме того, он является наиболее расширяемым (вы можете легко добавлять новые свойства для различных вычислений, если хотите).
Все, что вам нужно сделать, это создать свойства только для чтения и вызвать PropertyChanged с именем этого свойства, когда коллекция изменится (что звучит так, как будто вы это делаете).
Например, вот свойство "Среднее":
public Double Average
{
get { return mMyCollection.Average(); }
}
void mMyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
PropertyChanged(this, new PropertyChangedEventArgs("Average"));
}
Присоединенные свойства не будут работать - они предназначены для указания родительского свойства в дочернем элементе.
ValueConverters будет работать теоретически (хотя они, вероятно, должны присутствовать для каждого элемента в списке, а также для всей коллекции), но вы ничего не конвертируете, вы предоставляете дополнительные данные на основе существующих данных. Чтобы сделать это, вам нужно будет возиться со всеми видами шаблонов, и каждый раз, когда вам нужно что-то менять, вам нужно снова обойти их. Это будет сложно в спешке, и без пользы.