2011-01-13 5 views
1

Ich versuche, etwas ziemlich einfaches zu implementieren, aber ich bin auf meinen ersten Schritten in WPF und ich habe einige Probleme. Ich habe eine Klasse namens Component, die eine Eigenschaft namens Vertices hat. Vertices ist eine generische Liste des Typs Point. Ich möchte die Vertices-Eigenschaft an eine Listbox binden. Dies ist einfach durch diesen Code in meiner XAML in der Listbox Erklärung mit:Binden Sie eine generische Liste an eine Listbox und verwenden Sie auch eine Datatemplate

ItemsSource="{Binding Path=Component.Vertices, Mode=OneWay, Converter={StaticResource verticesconverter},UpdateSourceTrigger=PropertyChanged}" 

Der schwierige Teil ist, wenn ich versuche, ein Datatemplate für das Listenfeld zu erstellen. Ich möchte, dass jede Zeile der Listbox ein Textfeld mit den Werten des Vertex (Point.X, Point.Y) und eine Schaltfläche anzeigt, die es mir erlaubt, das Element zu löschen. Können Sie mir bei der Datatemplate-Definition helfen? Der folgende Code funktioniert nicht, die X, Y-Werte in zwei separaten Textfeldern zu binden. Können Sie mir auf den Fehler hinweisen und warum wird nichts in den Textfeldern angezeigt?

<ListBox ItemsSource="{Binding Path=Component.Vertices, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal" Margin="0,10,0,0"> 
      <TextBox Text="{Binding X}" MinWidth="35" MaxWidth="35"/> 
      <TextBox Text="{Binding Y}" MinWidth="35" MaxWidth="35"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
    /ListBox> 
+0

Bitte geben Sie mir einige Code-Behind für Ihre Klasse und die Sammlung, vielleicht ist das das Problem, auch zeigen Sie mir, wo Sie den DataContext, falls vorhanden. –

Antwort

1

Etwas wie folgt aus:

<ListBox ... Grid.IsSharedSizeScope="True"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition SharedSizeGroup="A"/> 
      <ColumnDefinition SharedSizeGroup="B"/> 
      <ColumnDefinition SharedSizeGroup="C"/> 
     </Grid.ColumnDefinitions> 
     <Grid.Children> 
      <TextBlock Grid.Column="0" Text="{Binding X}" Margin="5"/> 
      <TextBlock Grid.Column="1" Text="{Binding Y}" Margin="5"/> 
      <Button Grid.Column="2" Tag="{Binding}" Margin="5" Click="Button_Click" Content="Remove"/> 
     </Grid.Children> 
     </Grid> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Ereignishandler:

private void Button_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    Button senderB = (Button)sender; 
    Point pt = (Point)senderB.Tag; 
    Collection.Remove(pt); 
} 

Hinweis: Ihre Liste in der grafischen Benutzeroberfläche wird nicht aktualisiert, es sei denn, Ihre gebundene Sammlung INotifyCollectionChanged (Standard-Implementierung implementiert Sie kann verwenden: ObservableCollection<T>)

Edit: Gemeinsame verbindliche Fehler Ursachen :
1. Bound Quelle ist kein öffentliches Eigentum - es ein
2. Bindungs ​​Pfad nicht absolut ist und es gibt keine Datacontext von
starten> machen -> Datacontext des Fensters im Konstruktor selbst einstellen (this oder) ...
-> Set Elementnamen in der Bindung an den Namen des Fensters, wenn das ist, wo Ihr Eigentum ist

Edit2: wenn Sie Ihre Sammlung von Vertices besteht und wenn Ihre Vertex Klasse enthält einen Punkt mit der Property-Name Point Sie müssen die Bindungen zu {Binding Point.X} und {Binding Point.Y} ändern, mehr Code beim nächsten Mal bitte.

+0

Ich habe den genauen Code oben verwendet und es zeigt nichts an. Soll ich meinen bisherigen Code für die ListBox ItemSource binden oder muss ich dort Änderungen vornehmen? (Ich habe den Konverter entfernt, um Ihren Code natürlich zu testen) – muku

+0

Sie sollten Ihre vorherige Bindung behalten (die die Sammlung nur binden sollte, was hat der Konverter getan?), Die Bindung sollte direkt zur Sammlung von Punkten gehen, so dass der DataContext in der DataTemplate ist ein Punkt (ermöglicht den Zugriff der Koordinaten über {Binding X}, Debug Binding Fehler überprüfen das Ausgabefenster (Ansicht -> Ausgabe in VS2010) –