2009-05-17 5 views
3

Ich versuche, eine TwoWay-Bindung auf ein Kombinationsfeld mit nur einer Auswahl der Objekte einer Sammlung festzulegen. Momentan funktioniert alles gut, wenn ich nur alles in der Auswahl binden möchte, aber in der Beispielklasse unten, was ist, wenn ich nur Elemente anzeigen möchte, bei denen Aktiv = Wahr ist? Ich kann die Elemente mit LINQ wie ItemsSource filtern = FROM x IN Coll WHERE x.Active = True, aber dann verliere ich die TwoWay-Bindung. Dh, wenn der Name oder der aktive Zustand in der Quelle von woanders aktualisiert wird, wird das Kombinationsfeld nicht automatisch aktualisiert.WPF Bindung an eine Combo mit nur einer Teilmenge der Elemente einer Collection

Ist das möglich? Wenn nicht, hat jemand, der damit zu tun hatte, einige Vorschläge?

'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 

Antwort

3

zwei Optionen:

Sie einen Rahmen wie Bindable LINQ verwenden können, die Ihre LINQ-Abfragen zurückgeben beobachtbaren Sammlungen macht (also die Bindung bleibt als Zweiweg).

Oder Sie könnten Ihre ComboBox Elemente zu einem Collection binden und jedes Element durch einen Filter Ereignishandler ausführen:

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

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

mit Code-Behind:

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

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

    e.Accepted = item.Active; 
} 

Bitte beachte, dass ich nicht ganz bin Stellen Sie sicher, dass eine CollectionViewSource die INotifyPropertyChanged-Schnittstelle erkennt und die Liste erneut abfragt, wenn sich ein Element ändert. Ich würde Bindable LINQ wirklich empfehlen, wenn der Filteransatz nicht funktioniert.

+0

Ja, ich dachte eigentlich, es selbst nicht versuchen, aber ich habe über eine andere Stelle irgendwo laufen, die sagten, dass die Ansicht der Change Fortpflanzung verlieren. Aber selbst wenn Views funktioniert, bin ich dankbar, dass ich etwas über Bindable LINQ gelernt habe. Das wird sicher auch für die Zukunft eine große Hilfe sein. Danke Matt! – JoshKraker

0

Die Collection Klasse kann das Sortieren und Filtern auf alle WPF Elemente hinzufügen steuert

Verwandte Themen