2011-04-16 32 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