2010-08-13 145 views
3

我有這樣的標籤綁定:更新內容時,子屬性改變

<Label Name="LblUsersWithHair"> 
    <Binding Path="Users" 
      ElementName="ElementSelf" 
      Converter="{StaticResource Converter_UsersWithHairPresenter}" /> 
</Label> 

和轉換器:

...

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    var users = value as ObservableCollection<Users>; 
    if (users == null) return null; 

    var usersWithHair = users.Count(user => user.HasHair == true); 
    return "There are " + usersWithHair + " there has hair."; 
} 

...

問題現在當'HasHair'屬性發生更改時,標籤當然不會更新,因爲集合沒有更改。但是,如果設置此屬性,我該如何強制標籤重新綁定?

上面的例子是非常簡單的,但是希望你能幫助我...:O)

回答

1

你的綁定將只更新,如果列表觸發一個引發ListChanged事件。這通常只發生在列表中的結構更改(添加/刪除/替換)上,而不是單個列表項目發生更改 - 即使它實現了INotifyPropertyChanged。 您已經實現了您的項目INotifyPropertyChanged的之後,你仍然需要做以下兩個選項之一:

  • 使用修改的ObservableCollection,監聽到任何項目的的PropertyChanged-事件中(在添加註冊/刪除)並在任何更改中觸發ListChanged。
  • 使用可評估HasHair的過濾器謂詞創建CollectionViewSource,然後將您的標籤綁定到此CollectionViewSource的項目計數而不是原始列表。
+0

我有一個應用程序,它具有一個自定義類型的ObservableCollection,我所要做的就是在自定義類上實現INotifyPropertyChanged,並且當我通過綁定更改下面的項目時,DataGrid會正確更新,而無需執行任何其他操作。 我的應用程序是用WPF編寫的,所以如果OP的應用程序在Silverlight中,我不知道它的行爲是否有所不同。 – Mike 2010-08-14 04:49:04

+0

是的,你的網格行會更新,因爲DataGrid是一個ItemsControl,每一行都隱式地創建一個綁定到相應的列表項。 但是一個ContentControl(作爲標籤)綁定到列表(而不是更改後的列表項)將不會在PropertyChange上更新列表項。 – 2010-08-14 10:21:14

+0

哦,好的。我明白你在說什麼。我從來沒有在DataGrids或TreeViews以外的任何地方嘗試過。每天學些新東西... – Mike 2010-08-14 18:54:59

2

您需要實現INotifyPropertyChangedUsers類爲HasHair財產。

檢查這個帖子How to force ListBox to reload properties of ListBoxItems

+0

由於您的綁定是針對實際的集合,轉換器很可能只會在集合本身發生更改時才被觸發。如果不在Users類中實現INotifyPropertyChanged,那麼只有當Users項的數量發生更改時,只有其中一個Users項的屬性發生更改時,ObservableCollection纔會更新。 – Mike 2010-08-13 16:36:53

0

邁克是可能目標。該框架需要一些方法來知道屬性何時發生變化,並且INPC(INotifyPropertyChanged)因此而存在。我說的可能是正確的,因爲在這種情況下,你正在使用一個有INPC烘焙的ObservableCollection,而且我猜你正在根據用戶檢查綁定到HasHair的東西來添加/從列表中減去。如果您仍然遇到問題,請發佈您的代碼以及您認爲應該發生的事情。

當你在它,可以縮短了該標籤聲明只是:

<Label Content="{Binding Users, Converter={StaticResource Converter_UsersWithHairPresenter}"/> 

您還可以將調試斷點您轉換器的內部,看看先不管它甚至被稱爲,並檢查您的輸出窗口來查看是否有任何數據綁定錯誤被報告。

HTH,
Berryl