2017-08-18 1 views
0

J'ai vu quelques exemples avec le tri et le filtrage en utilisant colllectionView mais aucun ne le fait d'une manière logique comparative.Comment comparer les éléments WPF ListBox avec une chaîne?

exemple:

// Button event to send an item from LB1 to LB2 
private void BaddProduct_Click(object sender, RoutedEventArgs e) 
{ 
    if(Lb2.Items.Contains("item")) 
    { 
    MessageBox.Show("This item is already there!"); 
    } 
    //second example 
    if(Lb2.Items.StartWith("item")) 
    { 
    MessageBox.Show("This item is already there!"); 
    } 
} 

Le code fonctionne pour WinForms. Y a-t-il une approche pour WPF?

Merci!

+0

Quelle est votre question? – Sach

+0

poste plus de code ... –

+0

J'ai 2 ListBoxs WPF. Je souhaite ne pas envoyer le même article deux fois du premier au second ListBox comme montré dans mes exemples. – BerBar

Répondre

0

Ce code fonctionnerait également dans le fichier .xaml.cs, car le 'code derrière' fait directement référence à tous les éléments WPF non-templates nommés.

Si vous souhaitez que les sources de données soient un peu plus dynamiques, je suggère d'utiliser IEnumerable collections pour lier votre ItemSource, puis vous pouvez effectuer tout le filtrage en utilisant LINQ.

(edit: Correction d'une faute '' à 'sources de données des sources de données')

+0

ayant les mêmes durs mais cela n'a pas fonctionné. Btw j'utilise les observableColletions pour lier ma DS, mais toujours pas se lever. J'ai essayé de le lancer, mais sans chance. Par exemple: LB2.Items.Cast () .Any (x == x.ToString()) – BerBar

+0

@BerBarBerBar Si vous liez déjà la propriété ItemsSource de vos deux ListBoxes à deux ObservableCollections, vous devez opérer sur ces collections source, pas sur ListBox.Items. – Clemens

+0

@ Clemens8 Je vais essayer. Je vous remercie! – BerBar

0

Pour toute personne qui a besoin de cette approche:

//called by the collectionView 
private bool UserFilter(object item) 
{ 
     string produtoItem; 
     //my LB1. With dynamic type i am gettting the item selected. 
     dynamic selectProdutoItem = LbProdutoPlano.SelectedItem; 
     produtoItem = selectProdutoItem.produtoPlanoNome; 

     if (String.IsNullOrEmpty(produtoItem)) 
     { 
      return true; 
     } 
     else 
     { 
      //this will do a comparative logic on my selected item on LB 1. fichaProduto is my class and fichaProdutoProdutoNome a string of that class that is the same string or the item in LB1, produtoItem. 
      return ((item as fichaProduto).fichaProdutoProdutoNome.IndexOf(produtoItem, StringComparison.OrdinalIgnoreCase) >= 0); 
     } 
} 
// a button to add an item from LB1 to LB2. 
private ButtonAdd_Click() 
{ 
     //created the collectionView in here having the itemSource the LB2 that is already binded. 
     CollectionView viewFiltro = (CollectionView)CollectionViewSource.GetDefaultView(LbProdutoPlanoEscolhido.ItemsSource); 
     // this is the key of this logic. The View will do a comparative logic from the retur of the UserFilter method. 
     viewFiltro.Filter = UserFilter; 
     // so if the View found it, it will count 1. 
     if (viewFiltro.Count == 1) 
     { 
      MessageBox.Show("This product is already in the LB2."); 
     } 
     else 
     { 
     // add the item into LB 2. 
     } 
} 

De cette façon, nous ne devons comparer observable's Collection pour aucune des ListBoxes. Utilisez simplement le filtre de prédicat du CView et vérifiez le résultat en utilisant la propriété COUNT. Si c'est 1, cela signifie que le filtre recherche un élément dans LB1 et le trouve sur le LB 2.