Ne pouvez pas obtenir WPF ListView à se lier à ObservableCollection
J'ai été jouer avec WPF pour la première fois, plus précisément à l'aide d'une ListView que je veux lier à une ObservableCollection qui est une propriété sur la page code-behind. Droit maintenant, je suis juste essayer d'obtenir une idée de comment les choses fonctionnent donc j'ai essayé de garder ce simple. Malheureusement, je n'arrive pas à voir où je vais mal avec cette.
Ma page code-behind a une propriété qui ressemble à ceci:
public ObservableCollection<Code> Code { get; set; }
J'ai un bouton sur le formulaire que les requêtes et remplit le Code de la propriété.
Le Code de la classe est une simple classe POCO:
public class Code
{
public string Line { get; set; }
}
J'ai ajouté un espace de noms pour le code XAML de la fenêtre:
<Window x:Class="SampleWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SampleWPF"
Title="MainWindow" Height="350" Width="525"
>
Et la liste ressemble à ceci:
<DockPanel Height="311" HorizontalAlignment="Left" Name="dockPanel1"
VerticalAlignment="Top" Width="182">
<ListView Name="lstCode"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window, AncestorLevel=1}, Path=Code}"
DisplayMemberPath="Line">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Line}" />
</GridView>
</ListView.View>
</ListView>
</DockPanel>
J'ai aussi essayé de mettre le DataContext dans le code-behind de constructeur, avec pas de chance, ex.:
this.DataContext = this;
EDIT: Déplacement de cette ligne après la ligne de code qui crée la collecte des éléments fixes (ainsi que les autres modifications proposées).
Et j'ai aussi essayé de définir explicitement la ItemsSource dans le code (dans mon gestionnaire de clic):
this.lstCode.ItemsSource = this.Code;
J'ai regardé un certain nombre d'exemples, mais je suis toujours en manque de quelque chose ici (pas vraiment une surprise).
OriginalL'auteur Paul | 2011-02-03
Vous devez vous connecter pour publier un commentaire.
Euh, vous essayez de faire quelque chose de simple avec une terrible magie 😉
Votre liaison devrait ressembler à
{Binding Path=Code}
. Pour faire ce travail, vous devez également définirDataContext
àthis
, tout comme vous l'avez écrit. Cela devrait vous donner plus simple liaison. Magique avec la recherche d'ancêtres n'est pas nécessaire ici.Dans les applications avancées, vous devriez plutôt utiliser le Modèle - Vue - Vuemodèle modèle et de définir le contexte de données à ViewModel objet plutôt que de
this
, mais juste pour tester et d'essayer de WPF, cette approche devrait être ok.Voici quelques exemples:
Et le code behind:
Et voici comment vous devez créer
listview
pour votre échantillon. Vous avez de classe spéciale et vous ne voulez probablement pas à afficherToString()
résultat sur chaque objet. Pour afficher l'élément de quelque façon que vous pouvez imaginer, vous devriez utiliser le modèle de données et d'y créer des contrôles et les lier à des propriétés de l'élément, qui a été dans la liste que vous avez lierListView
.OriginalL'auteur Jarek