2009-05-17 9 views
3

J'essaie de définir une liaison TwoWay à une zone de liste déroulante en utilisant uniquement une sélection d'objets d'une collection. Actuellement, tout fonctionne bien si je veux juste lier tout dans la colelction, mais dans la classe exemple ci-dessous, que se passe-t-il si je veux seulement montrer des éléments où Active = True? Je peux filtrer les éléments en utilisant LINQ comme ItemsSource = FROM x IN Coll WHERE x.Active = True mais je perds la liaison TwoWay. C'est-à-dire que si le nom ou l'état actif de la source est mis à jour ailleurs, la liste déroulante ne se met pas automatiquement à jour.WPF Liaison à un combo en utilisant uniquement un sous-ensemble d'éléments d'une collection

Est-ce que c'est possible? Sinon, est-ce que quelqu'un qui a eu à faire avec cela a des suggestions?

'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 

Répondre

3

Deux options:

Vous pouvez utiliser un framework comme Bindable LINQ qui rend vos requêtes LINQ retour collections observables (donc les Stays contraignants que dans les deux sens).

Ou vous pouvez lier votre articles de ComboBox à un CollectionViewSource et exécuter chaque élément par un gestionnaire d'événements Filtre:

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

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

avec 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; 
} 

Notez que je ne suis pas tout à fait Assurez-vous qu'un objet CollectionViewSource reconnaît l'interface INotifyPropertyChanged et réexécute la liste lorsqu'un élément est modifié. Je suggère vraiment Bindable LINQ si l'approche de filtre ne fonctionne pas.

+0

Oui, je ne l'ai pas essayé en fait moi-même, mais je ne courir à travers un autre poste quelque part dit que la vue va perdre la propagation ChangeEvent. Cependant, même si Views a bien fonctionné, je suis reconnaissant d'en savoir plus sur Bindable LINQ. Ce sera certainement une aide précieuse pour l'avenir. Merci Matt! – JoshKraker

0

La classe CollectionViewSource peut ajouter le tri et le filtrage à tous les articles WPF contrôle

Questions connexes