2014-08-27 7 views
1

J'essaie d'afficher une collection d'objets dans une wpf-Listview et de fournir une liste déroulante pour la sélection des valeurs d'une autre collection.mvvm Sélection ComboBox dans Listview

code pour illustrer mon problème:

XAML: (Window gets its DataContext set in app.xaml.cs) 

<ListView ItemsSource="{Binding Path=Books}" SelectedItem="{Binding Path=CurrentBook}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="author" DisplayMemberBinding="{Binding author}" /> 
      <GridViewColumn Header="title" DisplayMemberBinding="{Binding title}" /> 
      <GridViewColumn Header="genre"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Genres}" IsSynchronizedWithCurrentItem="true" DisplayMemberPath="genreName" SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CurrentBook_Genre}"> 
         <ComboBox.ItemTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding genreName}" /> 
           <TextBlock Text="{Binding genreDescription}" /> 
          </StackPanel> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

est maintenant pour « CurrentBook_Genre » une propriété du MainWindowViewModel, selon la valeur de l'élément affiché dans le ListView est défini par son compositeur.

De la même manière, la même zone de liste déroulante est affichée dans chaque "ligne" du ListView. Je suppose que j'ai besoin d'une sorte de "EditValueTemplate" et "ShowValueTemplate" et un sélecteur de quelque sorte, ce serait bien, si le ComboBox est montré seulement dans la ligne qui est en mode d'édition - je suppose que c'est une chose commune pour la plupart des applications DataDriven, alors peut-être il y a un moyen plus facile iam pas au courant.

La seule bonne explication pour cela était http://tech.pro/tutorial/857/wpf-tutorial-using-the-listview-part-3-in-place-edit Mais ils travaillent avec dépendance-propriétés, opposées aux modèles ViewModel-emballés à l'aide Iam.

+0

* ils fonctionnent avec des propriétés de dépendance, contrairement aux modèles enveloppés par ViewModel iam utilisant * ... un 'DependencyProperty' n'est pas * opposé * à une propriété normale et ils fonctionnent tous les deux de la même manière quand il s'agit de ' Chemin de liaison. Vous aurez des problèmes en tant que développeur si vous ne pouvez pas adapter vos solutions trouvées pour répondre à vos propres problèmes. – Sheridan

+0

Je lis à leur sujet maintenant, merci de votre intérêt. Chaque jour de nouveaux concepts et noms - il devrait s'améliorer avec l'adaptation si je comprends les outils et les concepts de base. – rrrrn

+0

Il semble que votre problème soit dû au fait que des données ont lié une seule propriété de votre classe 'MainWindowViewModel' à la propriété' ComboBox.SelectedItem' (ou similaire) de chaque 'ComboBox' dans' GridView'. La solution consiste à ajouter une copie de cette propriété (ou à la déplacer) dans la classe 'Book', de sorte que chaque élément' Book' possède sa propre propriété et sache quel élément a été sélectionné dans son propre 'ComboBox'. – Sheridan

Répondre

0

Il existe un moyen beaucoup plus simple d'afficher un contrôle lorsqu'une ligne de la grille est éditée et un autre lorsqu'il n'est pas modifié par rapport à l'exemple que vous avez trouvé. Essayez ceci:

<DataGrid ItemsSource="{Binding Books}" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CurrentBook_Genre.genreName}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
      <DataGridTemplateColumn.CellEditingTemplate> 
       <DataTemplate> 
        <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Genres}" IsSynchronizedWithCurrentItem="true" DisplayMemberPath="genreName" SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CurrentBook_Genre}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellEditingTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

Ceci affichera une ComboBox lorsque la ligne est en cours d'édition et une ancienne plaine TextBlock quand il est pas.