2010-03-24 5 views
13

J'ai un WPF ListBox que je voudraisDatabinding ListBox avec SelectionMode = Multiple

  • Activer la sélection multiple dans le ListBox et
  • Databind ListBox à mon modèle de vue.

Ces deux exigences semblent être incompatibles. Mon modèle de vue a une propriété ObservableCollection<T> à lier à ce ListBox; J'ai mis en place une liaison dans XAML de la propriété à la propriété ListBox.SelectedItems. Lorsque j'ai compilé, j'ai reçu une erreur indiquant que la propriété SelectedItems était en lecture seule et ne pouvait pas être définie à partir de XAML.

Suis-je lié à la mauvaise propriété de contrôle? Existe-t-il un moyen de lier un ListBox à plusieurs sélections dans XAML à une propriété de collection de modèle de vue? Merci de votre aide.

Répondre

6

J'ai fini par utiliser un peu de code-behind dans un gestionnaire d'événements SelectionChanged pour définir la propriété du modèle de vue. Plus simple que la création de wrappers d'objets.

21

Ce que vous pouvez faire pour contourner ce problème:

Créer une propriété IsSelected sur les éléments que vous affichez dans la liste. Je suppose que ceux-ci sont également représentés par un modèle de vue. Il ne devrait donc pas être un drame pour ajouter une propriété supplémentaire. Si ce ne sont que des objets métier, pensez à utiliser une classe wrapper pour les insérer sans peine dans les objets du modèle (here est un de ces systèmes, je l'utilise tous les jours pour envelopper mes objets métier)

Utiliser un style de conteneur d'éléments à lier la propriété IsSelected de la zone de liste élément à la propriété IsSelected des articles que vous affichez, comme si

<ListBox.ItemContainerStyle> 
     <!-- This Style binds a ListBoxItem to a the ViewModelItem. --> 
     <Style 
      TargetType="{x:Type ListBoxItem}"> 
      <Setter 
      Property="IsSelected" 
      Value="{Binding IsSelected, Mode=TwoWay}" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 

(peut-être besoin d'une fonction de l'attribut du style, pas sûr)

maintenant, chaque fois qu'une liste l'élément de boîte est sélectionné votre modèle de vue le saura et peut mettre à jour son c interne ollection au besoin.

+0

Je souhaite que vous avez inclus le code viewmodel ... Vous ne savez pas quels types de données devraient être utilisés sur la propriété. – barrypicker

+0

La propriété IsSelected est un booléen. –

+0

C'est une très bonne solution. Juste au cas où, pour une DataGrid, le XAML est: Guillaume

0

J'ai publié une technique pour autoriser une liaison en lecture seule à la propriété SelectedItems d'un DataGrid WPF simplement en étendant le DataGrid qui, je crois, pourrait facilement être co-opté pour un ListBox. Vous pouvez voir mon poste à https://stackoverflow.com/a/16953833/62278