我有一些标签文本,我试图根据ObservableCollection中的值之和生成。基本上,ObservableCollection中的项目都包含Quantity和PricePerItem属性,当我从集合中添加和删除项目时,我想要更新标签。
关于如何开始这个的任何想法?
答案 0 :(得分:3)
这实际上比你预期的要困难一些。您可以使用IValueConverter
,但是当您更改集合中的值时,总和将不会保持最新,因为转换器不会看到单个成员中的更改,只会看到集合本身的更改。
我为表达式代码库编写了一个示例,演示了WPF的Collection Aggregator,它使用Blend SDK Behavior来执行此操作。它允许您显示集合中值的总和,平均值,最小值,最大值等,并使其自动保持最新(假设集合实现IBindingList
或INotifyCollectionChanged
,并且类实现INotifyPropertyChanged
)。
这可以通过实际订阅集合已更改事件,以及单个元素属性更改事件以及为您处理聚合来实现。
答案 1 :(得分:0)
创建一个ValueConverter
并绑定到该集合。
e.g。基本的和转换器可以是这样的:
public class SumConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var input = value as ObservableCollection<Employee>;
return (from emp in input
select emp.Id).Sum();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
如果要提高可重用性,可以使用ConverterParameter传递应该总结的属性名称,然后使用反射进行。
问题是您需要绑定到集合属性,否则集合更改通知将不会更新绑定。