Можно ли использовать IMultiValueConverter для списка элементов?

У меня есть EmployeeList как observableCollection объекта Employee.

Объект Employee имеет зарплату.

Я хочу отобразить несколько значений, таких как средняя зарплата сотрудников в XAML, и поле пользовательского интерфейса должно автоматически обновляться при добавлении элемента в список или при изменении поля зарплаты в любом из обновленных элементов.

Это может быть достигнуто путем создания свойства для среднего значения и прослушивания обработчиков коллекций Changed и ProperyChanged в списке.

Но я уверен, что должен быть какой-то другой лучший способ сделать это. (Например, используя AttachedProperties или IValueConverter / IMultiValueConverter)

В связи с этим у меня есть следующие вопросы.

  1. Можно ли использовать 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 будет работать теоретически (хотя они, вероятно, должны присутствовать для каждого элемента в списке, а также для всей коллекции), но вы ничего не конвертируете, вы предоставляете дополнительные данные на основе существующих данных. Чтобы сделать это, вам нужно будет возиться со всеми видами шаблонов, и каждый раз, когда вам нужно что-то менять, вам нужно снова обойти их. Это будет сложно в спешке, и без пользы.

Другие вопросы по тегам