Listview Datatemplate

  • WPF

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Listview Datatemplate

    Hi,

    wollte ne OberservableCollection an eine Listview binden, das sieht dann so aus:
    XAML

    XML-Quellcode

    1. <ListView Name="History" Grid.Row="1" Grid.Column="1" ItemsSource="{Binding History}" Grid.ColumnSpan="1" Grid.RowSpan="1">
    2. <ListView.View>
    3. <GridView ColumnHeaderContainerStyle="{StaticResource myHeaderStyle}">
    4. <GridViewColumn Header="Name" Width="200">
    5. <GridViewColumn.CellTemplate>
    6. <DataTemplate>
    7. <TextBlock Style="{DynamicResource MaterialDesignTitleTextBlock}" Text="{Binding Text}" ></TextBlock>
    8. </DataTemplate>
    9. </GridViewColumn.CellTemplate>
    10. </GridViewColumn>
    11. <GridViewColumn>
    12. <GridViewColumn.CellTemplate>
    13. <DataTemplate>
    14. <Button Style="{DynamicResource MaterialDesignToolButton}">
    15. <materialDesign:PackIcon Kind="Alert"></materialDesign:PackIcon>
    16. </Button>
    17. </DataTemplate>
    18. </GridViewColumn.CellTemplate>
    19. </GridViewColumn>
    20. </GridView>
    21. </ListView.View>
    22. </ListView>


    C#-Quellcode

    1. class DataModell : INotifyPropertyChanged {
    2. private static DataModell modell = null;
    3. public event PropertyChangedEventHandler PropertyChanged;
    4. private void NotifyPropertyChanged(string info) {
    5. if (PropertyChanged != null) {
    6. PropertyChanged(this, new PropertyChangedEventArgs(info));
    7. }
    8. }
    9. public static DataModell Instance {
    10. get {
    11. if (modell == null) {
    12. modell = new DataModell();
    13. }
    14. return modell;
    15. }
    16. }
    17. private static ObservableCollection<HistoryElement> _History= new ObservableCollection<HistoryElement>();
    18. public ObservableCollection<ClipboardContent> History{
    19. get {
    20. _History.CollectionChanged += CollectionChangedHandler;
    21. return _History;
    22. }
    23. set {
    24. _History= value;
    25. NotifyPropertyChanged("History");
    26. }
    27. }
    28. private void CollectionChangedHandler(object sender, NotifyCollectionChangedEventArgs e) {
    29. NotifyPropertyChanged("History");
    30. }
    31. }


    Die HistoryElement Klasse hat zu Testzwecken bisher nur ein Feld mit Text="Test" drinne.
    Habe das Binding überprüft indem ich einfach Items rauslösche, das funktioniert wie gewünscht. Problem dabei ist allerdings nur das kein Text angezeigt wird 8| ?

    8-) faxe1008 8-)
    zum Problem selbst weiss ich nichts - ich arbeite bislang nicht mit ListView.
    Aber dein Viewmodel ist etwas fragwürdig: Wieso ist _History static?
    Wieso hat History einen setter?
    Warum sendest du ein PropertyChanged, wenn _History ein CollectionChanged sendet?
    Warum komplettierst du den Singleton-Pattern nicht?

    Also mein Vereinfachungsvorschlag sähe so aus:

    C#-Quellcode

    1. class DataModell : INotifyPropertyChanged {
    2. private static DataModell modell = null;
    3. public event PropertyChangedEventHandler PropertyChanged;
    4. private void NotifyPropertyChanged(string info) {
    5. if (PropertyChanged != null) {
    6. PropertyChanged(this, new PropertyChangedEventArgs(info));
    7. }
    8. }
    9. private DataModell() { /* ensure singleton */ }
    10. public static DataModell Instance {
    11. get {
    12. if (modell == null) { modell = new DataModell(); }
    13. return modell;
    14. }
    15. }
    16. private ObservableCollection<HistoryElement> _History= new ObservableCollection<HistoryElement>();
    17. public ObservableCollection<ClipboardContent> History{
    18. get {
    19. _History.CollectionChanged += CollectionChangedHandler;
    20. return _History;
    21. }
    22. }
    23. }

    Das Ding war static, weil ich da noch was anderes probiert hatte und vergaß das wieder rückgängig zu machen.
    History hat einen Setter weil ich in einer anderen Methode eine komplett neue Liste übergebe und die alte verworfen werden soll.
    Ich dachte zuerst das es daran liegt, das ich kein PropertyChanged raise, aber geht auch so, hast recht.

    Die Änderungen auch wenn sie gut sind, haben das Problem allerdings nicht gelöst ^^ . Habe es gerade Alternativ mit ner Listbox probiert, funktioniert allerdings auch nicht.

    8-) faxe1008 8-)
    ansonsten findich nix am Xaml - ich hab jetzt doch noch ein Listview-Sample gefunden - das sieht aber vom Prinzip genau aus wie deines:
    Spoiler anzeigen

    XML-Quellcode

    1. <ListView ItemsSource="{Binding Persons}" IsSynchronizedWithCurrentItem="True">
    2. <ListView.View>
    3. <GridView>
    4. <GridViewColumn Header="Name" >
    5. <GridViewColumn.CellTemplate>
    6. <DataTemplate>
    7. <TextBox Text="{Binding Name}"/>
    8. </DataTemplate>
    9. </GridViewColumn.CellTemplate>
    10. </GridViewColumn>
    11. <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
    12. <GridViewColumn Header="Phone" DisplayMemberBinding="{Binding Phone}"/>
    13. <GridViewColumn Header="BirthDay" DisplayMemberBinding="{Binding BirthDay, StringFormat=\{0:d\}}"/>
    14. <GridViewColumn Header="Rate" DisplayMemberBinding="{Binding Rate}"/>
    15. </GridView>
    16. </ListView.View>
    17. </ListView>
    Also kann nur das Binding spinnen, oder die Styles, die du verwendest.

    faxe1008 schrieb:

    Habe das Binding überprüft indem ich einfach Items rauslösche, das funktioniert wie gewünscht.
    Rauslöschen scheint also nicht der korrekte Test auf korrektes Binding zu sein.
    Bei mir ist immer ein gutes Zeichen, wenn ich BindingPicking verwenden kann, also das Binding aussuchen, wenn ich "Create Databinding" klickse.
    Hier paar Bilder vom PropertyGrid des XamlDesigners:
    Da auf das gelbe Quadrat geklickst
    Öffnet Optionen, was man alles machen kann -> "Create Binding" klicksen
    Binding aussuchen
    Jo, und wenn man ein Binding aussuchen kann, ist meist alles gut (nicht immer).
    Wenn man kein Binding aussuchen kann, ist meist garnicht gut.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()