2009-05-17 89 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项目控制