2011-04-16 30 views
3

我有一些标签文本,我试图根据ObservableCollection中的值的总和来生成。实质上,ObservableCollection中的项目都包含一个Quantity和PricePerItem属性,当我添加和删除集合中的项目时,我希望标签更新。WPF - 从集合标签文本?

关于我如何开始在这方面的任何想法?

+0

您是否也在编辑您的员工实例,或者只是添加/删除员工? – 2011-04-16 00:55:55

+0

集合中的单个项目可能会被编辑以及添加/删除。 – 2011-04-16 01:03:34

回答

3

这实际上比您期望的要难一些。您可以使用IValueConverter,但是当您更改集合中的值时,总和不会保持最新,因为转换器不会在单个成员中看到更改,只会看到集合本身。

我写了一个样品的表达代码库展现着Collection Aggregator为WPF它采用了混合SDK行为做到这一点。它可以让你集合中显示的总和,平均值,最小值,最大值等的值,并将它自动保持最新(提供集合实现IBindingListINotifyCollectionChanged和类实现INotifyPropertyChanged)。

这是通过实际订阅集合改变事件,以及单个元素属性更改事件,并为你办理聚集。

+0

由于个别项目显然可以编辑,所以您的解决方案就是要走的路。 – 2011-04-16 01:07:33

0

创建ValueConverter并绑定到集合。

例如一个基本的总和转换器可以是这样的:

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通过,应该这样使用反射来概括,然后属性名称。

的问题是,你需要绑定到一个集合属性,否则收集改变的通知将不会更新绑定。

+0

尽管如此,这不起作用,因为个别员工的更改不会触发价值转换器......请参阅我的答案以获取更详细的解释。 – 2011-04-16 00:53:25

+0

我意识到这一点,OP只说:“当我添加和删除集合中的项目,我想标签更新” – 2011-04-16 00:54:22

+0

是的,只要这是所需的,一个IValueConverter工程很棒...... – 2011-04-16 00:55:09