2009-05-17 132 views
3

我試圖設置一個TwoWay綁定到組合框只使用集合的對象的選擇。目前,如果我只想綁定所有內容,但在下面的示例類中,如果我只想顯示Active = True的項目,那麼一切正常。我可以使用LINQ來篩選項目,如ItemsSource = FROM x IN Coll WHERE x.Active = True,但是然後我失去了TwoWay綁定。即,如果源中的名稱或活動狀態是從其他位置更新的,則組合框不會自動更新。WPF使用僅集合的項目的子集綁定到一個組合

是可以做到的嗎?如果沒有,那麼有誰需要處理這個問題有一些建議?

'The Class 
Public Class Test 
    Implements ComponentModel.INotifyPropertyChanged 

    Private _Name As String 
    Private _Active As Boolean 

    Public Sub New(Name As String, Active As Boolean) 
     _Name=Name 
     _Active=Active 
    End Sub 

    Public Property Name() As String 
End Class 



'Declare a Collection and add some Tests, then bind to Cbo in Page Load 
Dim Coll As New ObservableCollection 
Coll.Add(New Test("Test1", True)) 
Coll.Add(New Test("Test2", False)) 
Coll.Add(New Test("Test3", True)) 
TheComboBox.ItemsSource=Coll 

回答

3

兩個選項:

您可以使用像Bindable LINQ一個框架,使您LINQ查詢返回可觀察集合(因此綁定保持原樣雙向)。

或者你可以在你的組合框的項目綁定到CollectionViewSource,並通過過濾器的事件處理程序運行的每個項目:

<CollectionViewSource 
    Source="{Binding MyItems}" 
    Filter="OnlyActiveItems" 
    x:Key="ItemsView"/> 

<ComboBox ItemsSource="{Binding Source={StaticResource ItemsView}}" /> 

與後臺代碼:

private void OnlyActiveItems(object sender, FilterEventArgs e) 
{ 
    e.Accepted = false; 

    var item = e.Item as Text; 
    if (item == null) return; 

    e.Accepted = item.Active; 
} 

請注意,我不完全確保CollectionViewSource將識別INotifyPropertyChanged接口,並在一個元素更改時重新查詢列表。如果過濾器方法不起作用,我真的會推薦使用Bindable LINQ。

+0

是啊,我其實沒有自己試試吧,但我沒有穿過另一篇文章的地方,說是觀就失去了傳播的ChangeEvent運行。 但是,即使Views工作,我很感謝您瞭解Bindable LINQ。這對未來肯定會有很大的幫助。 謝謝馬特! – JoshKraker 2009-05-18 00:14:31

0

的CollectionViewSource類可以添加排序和過濾到任何WPF項目控制