WPF MVVM: comment lier GridViewColumn à ViewModel-Collection?
À mon avis, j'ai une ListView lié à un CollectionView dans mon ViewModel, par exemple comme ceci:
<ListView ItemsSource="{Binding MyCollection}" IsSynchronizedWithCurrentItem="true">
<ListView.View>
<GridView>
<GridViewColumn Header="Title" DisplayMemberBinding="{Binding Path=Title}"/>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Path=Name}"/>
<GridViewColumn Header="Phone" DisplayMemberBinding="{Binding Path=Phone}"/>
<GridViewColumn Header="E-mail" DisplayMemberBinding="{Binding Path=EMail}"/>
</GridView>
</ListView.View>
</ListView>
Maintenant ces GridViewColumns sont fixes, mais je voudrais être en mesure de les changer à partir de ce Dernier. Je suppose que je vais devoir lier la GridViewColumn-collection pour quelque chose dans le ViewModel, mais quoi et comment?
Le ViewModel ne sais rien de WPF, donc je n'ai pas la moindre idée de comment réaliser cela dans MVVM.
toute l'aide ici?
Vous devez vous connecter pour publier un commentaire.
La
Columns
propriété n'est pas une propriété de dépendance, de sorte que vous ne pouvez pas lier. Toutefois, il pourrait être possible de créer une propriété attachée que vous pouvez lier à un point de collecte dans votre ViewModel. Cette propriété attachée alors créer les colonnes pour vous.Mise à JOUR
OK, voici une implémentation de base...
Propriétés attachées
ViewModel
XAML :
Noter que le
ColumnDescriptor
classe n'est pas réellement nécessaire, j'ai seulement ajouté pour plus de clarté, mais tout type de faire (par exemple, un type anonyme). Vous avez juste besoin de spécifier les propriétés de tenir le texte d'en-tête et d'affichage de nom de membre.Aussi, gardez à l'esprit qu'il n'est pas totalement encore testé, alors il pourrait y avoir quelques problèmes à résoudre...
ColumnDescriptor
pour chaque propriété.J'ai pris Thomas Levesque est une excellente solution et l'a modifié pour supprimer la statique de la collection de GridViews et ajouter également la possibilité de définir la largeur d'une colonne et de format de chaîne de caractères, donc j'ai pensé partager mon code.
Modifié propriété attachée classe:
Comportement (ce qui est stocké à l'encontre de chaque GridView et élimine la nécessité de stocker la collection-GridView mappages de manière centralisée):
Je pense que ce code serait la cause de certains problèmes de fuite de mémoire; Que votre classe GridViewColumns décrit, vous avez défini un dictionnaire statique "_gridViewsByColumnsSource" dans lequel contient le gridviews et leurs colonnes de la source de références; c'est donc une référence forte à l'ajout gridviews et les colonnes de la source; Parce que ce dictionnaire est statique, il semble qu'il y a un point de référence fixe "point" à la gridviews et les colonnes de la source de données tout le temps, si l'écran dans lequel le gridview fermé défini par l', le contrôle gridview ne peuvent être collectées par GC si GC est commencé; Comme de plus en plus d'écrans semblables ouvert, de plus en plus gridviews et ses colonnes de la source de données ne peuvent être collectées, il va y avoir de fuite de mémoire à la fin.