我有EmployeeList作为Employee Object的observableCollection。
Employee对象有Salary。
我希望显示一些值,例如XAML中员工的平均薪水,当项目添加到列表或更新任何项目中更改Salary字段时,UI字段应自动更新。
这可以通过创建平均属性并在列表中侦听集合Changed和ProperyChanged处理程序来实现。
但是,我确信应该有其他更好的方法来做到这一点。 (比如使用AttachedProperties或IValueConverter / IMultiValueConverter)
关于这一点,我有以下问题。
答案 0 :(得分:1)
使用属性肯定是要走的路,特别是从MVVM的角度来看。想想Occam's Razor:基本上,最简单的解决方案通常是最好的。
这当然是最干净的解决方案,因此最易于维护。此外,它是最具扩展性的(如果您愿意,可以轻松地为不同的计算添加新属性)。
您需要做的就是创建只读属性,并在集合更改时调用带有该属性名称的PropertyChanged(听起来就是这样)。
例如,这是“平均”属性:
public Double Average
{
get { return mMyCollection.Average(); }
}
void mMyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
PropertyChanged(this, new PropertyChangedEventArgs("Average"));
}
附加属性不起作用 - 它们用于在子元素中指定父元素。
ValueConverters在理论上会起作用(尽管它们可能必须在列表中的每个项目以及整个集合中),但是你并没有真正转换任何内容,而是根据现有数据提供额外的数据。要做到这一点,你需要使用各种模板,并且只要你需要改变任何东西,你就需要再次使用它们。它会匆忙变得复杂,并且没有任何好处。