2011-04-07 23 views
6

似乎我有一個多重綁定的問題。MultiBinding MultiValueConverter不更新

場景:
我有一個窗口有兩個datepickers和一個listview。 listliew包含一些稱爲「條目」的數據綁定元素。一個條目有一個名爲「日期」的屬性。

我只想讓我的列表視圖顯示日期在兩個日期選擇日期之間的條目。爲ListView結合的項目和日期

我的XAML代碼:

<ListView.ItemsSource> 
    <MultiBinding Converter="{StaticResource EntriesFilterConv}" 
       UpdateSourceTrigger="PropertyChanged"> 
    <Binding Path="Entries" UpdateSourceTrigger="PropertyChanged"/> 
    <Binding ElementName="EntryFromDate" Path="SelectedDate" 
      UpdateSourceTrigger="PropertyChanged"/> 
    <Binding ElementName="EntryToDate" Path="SelectedDate" 
      UpdateSourceTrigger="PropertyChanged"/> 
    </MultiBinding> 
</ListView.ItemsSource> 

然而,這並不工作。我的轉換器在SelectedDate更改時調用,但當條目更改時從不調用。

與正常數據這樣結合:

<ListView ItemsSource="{Binding Entries}"> 
    ... 
</ListView> 

正常的列表視圖的更新。 有什麼想法?

+0

我將刪除所有UpdateSourceTriggers,它們應該是多餘的,因爲'ListView'不會修改這些屬性,因此源永遠不會被更新。 – 2011-04-07 15:53:04

+0

謝謝,但這並沒有幫助。 – 2011-04-07 15:56:29

+1

我知道,這就是爲什麼我發佈它作爲評論。 – 2011-04-07 15:57:39

回答

4

我覺得有以下可能導致這樣的:如果你直接綁定到Entries ListView控件會聽CollectionChanged事件,但如果這樣的結合是一個MultiBinding內會導致重新評估可能是一個PropertyChanged通知的唯一的事情,這可能不適用於模型中的Entries屬性。

也許你可以訂閱CollectionChanged事件您的收藏和養PropertyChanged事件或讓你MultiBindingBindingExpression手動調用更新。

+0

我會盡力的。但我應該使用什麼財產?有一種叫做'this'的屬性嗎? – 2011-04-07 16:34:29

+0

你的模型是什麼樣的? 「條目」在哪裏定義?如果您不熟悉該文檔,還可以查看INotifyPropertyChanged文檔:http://msdn.microsoft.com/zh-cn/library/system.collections.specialized.inotifycollectionchanged.aspx – 2011-04-07 16:39:17

+0

我有一個通用類'ViewModelCollection '從IList ','INotifyCollectionChanged'和'INotifyPropertyChanged'繼承。在這種情況下,'Entries'是一個'ViewModelCollection '。我可以在我的課堂內訂閱「CollectionChanged」嗎? – 2011-04-07 16:45:07

8

找了幾個小時後,我找到了一個簡單而體面的答案! 由於的ObservableCollection不會引發PropertyChanged事件,但CollectionChanged,我們只需要綁定集合的Count觸發事件時,列表中的變化:

<MultiBinding Converter="{Resources:ListToStringConverter}"> 
    <Binding Path="List.Count" /> 
    <Binding Path="List" /> 
</MultiBinding> 

這個原始的相關信息完美的工作multibinding這裏:https://stackoverflow.com/a/10884002/817504

+5

這是不推薦的,因爲它可能會導致內存泄漏,你可以看到這裏: [鏈接](https://support.microsoft.com/en-us/kb/938416)。 它發生的原因是該屬性不是一個依賴項屬性,並且不實現INotifyPropertyChanged,所以WPF必須「綁定」到該屬性的唯一方法是使用PropertyDescriptor,該屬性附加一個PropertyChanged事件,導致對該屬性的硬引用。 – 2016-08-10 11:16:13

+0

有趣的是,thx,那麼什麼是正確的解決方案? – Profet 2016-08-12 12:41:28

+1

如果您的視圖模型中有屬性,則可以在集合更改時手動引發屬性已更改的事件(例如,在setter中)。 – 2016-08-25 06:33:29