2017-10-08 2 views
0

J'ai une liste déroulante qui affiche listview sur la liste déroulante, je suis MVVM Pattern et j'ai également défini la propriété publique dans mon Viewmodel et ça fonctionne bien quand je l'attribue à l'étiquette mais pour Combobox il ne semble pas compter sur ma liaison. J'ai essayé de nombreuses façons, mais incapable de trouver le problème.Problème de liaison combobox et listview wpf C#

XAML:

<ComboBox Name="SearchBox" IsEditable="True" Background="White" md:HintAssist.Hint="Search MUID" Grid.Column="1" Margin="5 0 0 0" 
        Grid.Row="0" Height="40" Width="400" HorizontalContentAlignment="Left" HorizontalAlignment="Left" SelectedItem="{Binding ElementName=lstview ,Path=SelectedItem}" > 
           <ComboBoxItem> 
           <ListView x:Name="lstview" ItemsSource="{Binding filterSW}" 
        SelectedItem="{Binding SelectedMU}" 
        Height="200" ScrollViewer.VerticalScrollBarVisibility="Visible"> 
            <ListView.View> 
             <GridView> 
              <GridViewColumn Width="130" Header="Mu-ID" /> 
              <GridViewColumn Width="130" Header="MU-Identifier" DisplayMemberBinding="{Binding MU_Identifier}" /> 
              <GridViewColumn Width="130" Header="Status" DisplayMemberBinding="{Binding RequestType}" /> 
              <GridViewColumn Width="130" Header="UniqueID" /> 
             </GridView> 
            </ListView.View> 
           </ListView> 
           </ComboBoxItem> 
          </ComboBox> 

Cela fonctionne bien pour moi quand je suis en utilisant la propriété publique et l'accès à son élément, j'ai aussi essayé de placer le texte = {} et liaison SelectedMU.MU_Identifier SelectedValue mais son juste ne fonctionne pas.

<Label Grid.Column="3" HorizontalAlignment="Center" Background="GreenYellow" Content="{Binding SelectedMU.MU_Identifier}"></Label> 
+0

Votre reliure est-elle un peu bizarre pour la Combobox? Pourquoi injectez-vous un ListView dans un seul élément ComboBox? Pourquoi avoir un ComboBox du tout? –

Répondre

2

On dirait que vous essayez de montrer une liste à plusieurs colonnes dans votre ComboBox déroulant au lieu de la liste standard où chaque élément montre juste une ligne de texte.

Pour obtenir cet effet, vous avez placé un ListView dans la liste déroulante.

Malheureusement, cela ne fonctionne tout simplement pas.

Les deux ComboBox et ListView descendent de Selector qui est une abstraction qui permet de sélectionner un élément d'une liste. Cela limite la propriété SelectedItem à l'un des éléments que sont contenus dans la liste. Si vous tentez d'attribuer à cette propriété une valeur qui ne figure pas dans la liste, l'affectation ne fonctionnera pas et la propriété conservera la valeur qu'elle avait avant l'attribution.

Maintenant, la liste peut être spécifiée directement dans XAML ou fournie sous la forme d'une liaison à la propriété ItemsSource. Vous effectuez correctement la liaison pour le ListView. Mais pour le ComboBox vous ne spécifiez pas cette liaison. Au lieu de cela, vous spécifiez exactement un élément de type ComboBoxItem qui contient l'entier ListBox comme valeur. Donc, la seule valeur qui pourrait être affectée avec succès à la propriété SelectedItem du ComboBox est ce simple ComboBoxItem. Mais votre liaison n'attribuera jamais cette valeur, c'est pourquoi le ComboBox ne montre jamais rien lorsqu'il est fermé. Quand il est ouvert, il montre le seul élément qui contient le ListView mais c'est juste un effet optique. Le binging de données ne va pas fonctionner. La raison pour laquelle cela fonctionne pour le Label est que le Label n'est pas contraint et peut montrer tout ce que le ListView lui dit de montrer.

Vous pouvez synchroniser le ListView et le ComboBox que lorsque les commandes ont les mêmes liaisons pour les ItemsSource et SelectedItem propriétés. Mais dans ce cas, vous ne serez pas en mesure de placer le ListViewà l'intérieur la liste déroulante. Le plus proche que vous pouvez obtenir à ce que vous voulez est en personnalisant le modèle de ComboBox comme décrit dans https://zamjad.wordpress.com/2012/08/15/multi-columns-combo-box, par exemple. Qu'est-ce que cela ne vous donnera pas par rapport à ListView est les en-têtes de colonne. De plus, les colonnes seront espacées uniformément dans la liste déroulante mais c'est ce que vous avez dans votre ListView de toute façon.

Si vous voulez automatique du format eux, vous auriez besoin d'ajouter Width="Auto" SharedSizeGroup="cN" à chaque ColumnDefinition où « cN » devrait avoir le numéro de colonne au lieu de N pour les rendre uniques dans le Grid et ajouter Grid.IsSharedSizeScope="True" au <ComboBox >

C'est beaucoup de problèmes pour quelque chose que l'on s'attend à beaucoup plus simple, mais, malheureusement, vous ne pouvez pas placer un ListView dans le modèle ComboBox, c'est une limitation de la façon dont la classe de base fonctionne avec sa liste d'éléments.

Il existe d'autres options si vous envisagez d'utiliser des bibliothèques de contrôle tierces. J'ai travaillé avec Syncfusion, ils ont SfMultiColumnDropDown qui fait ce que vous voulez. Je suis sûr que d'autres bibliothèques populaires ont également des contrôles similaires.

+0

Merci pour votre avis. :) –