none
Observable Collection wird nach Leerung nicht mehr angezeigt RRS feed

  • Frage

  • Hallo, Ich habe ein Problem mit Observable Collections im Datagrid von WPF.

    Binde ich eine Liste mit Inhalt (count>0) an das DataGrid, wird jedes hinzugefügte Item sofort sauber angezeigt.

    Auch ein wegnehmen eines Items wird sauber angezeigt.

    Soweit so gut.

    Binde ich aber eine leer Liste (count=0), wird nichts angezeigt, auch nicht nach hinzufügen eines neuen Items.

    Mache ich die Liste zwischendurch leer, habe ich dasselbe Problem.
    Die Liste existiert jederzeit.

    Ich mache nicht viel mehr als folgendes:

    in der DataContext-Klasse:

    meineKlasse AktuelleInstanz {get;set;}

    ObservableCollection<meineKlasse> MeineListe{get;set;}

    <DataGrid ItemsSource="{Binding MeineListe}" SelectedItem="{Binding aktuelleInstanz}">

    </DataGrid>

    Beim Hinzufügen:

    meineListe.add(new meineKlasse())

    beim löschen: 

    meineListe.remove(aktuelleInstanz)

    Im Window.Onloaded:

    this.DataContext= new meineContextklasse()

    Sobald 'meinListe' einmal leer ist, wird nach Hinzufügen nichts mehr angezeigt im DataGrid.
    Ist aber was drin, wird nach hinzufügen das neue Item angezeigt.
    Auch wenn ich noch ein Item einfüge, ändert sich nichts.

    Woran kann das liegen ?

    Samstag, 29. Juli 2017 19:57

Antworten

  • Hallo Torsten,

    schau mal bitte, ob Du nicht irgendwo die Instanz von "meineListe" erneuerst, also bspw. meineListe = new ObservableCollection<MeineKlasse>() oder ähnliches stehen hast.

    Was mir noch auffällt: Du hast im Binding "MeineListe", also mit großem "M", im Code aber "meineListe" mit kleinem "m". Ist letzteres nur die Membervariable zur Eigenschaft oder schiebst Du die Elemente in der Liste evtl. von Hand (also irgendwo per Code) hin und her?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Sonntag, 30. Juli 2017 06:59

Alle Antworten

  • Hi Torsten,
    vermutlich liegt es an Deinem Code, den Du nicht gezeigt hast.

    Ich kann Dein Problem nicht reproduzieren. Dazu die nachfolgende Demo:

    XAML:

    <Window x:Class="WpfApp1CS.Window06"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1CS"
            mc:Ignorable="d"
            Title="Window06" Height="300" Width="300">
      <Window.Resources>
        <Style TargetType="Button">
          <Setter Property="Margin" Value="5"/>
        </Style>
      </Window.Resources>
      <StackPanel>
        <Button Content="Leeren" Click="Button_Click_1"/>
        <Button Content="Hinzufügen" Click="Button_Click_2"/>
        <Button Content="markierte Zeilen Löschen" Click="Button_Click_3"/>
        <DataGrid Name="dg" ItemsSource="{Binding MeineListe}"/>
      </StackPanel>
    </Window>

    CodeBehind:

    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Windows;
    
    namespace WpfApp1CS
    {
      /// <summary>
      /// Interaction logic for Window06.xaml
      /// </summary>
      public partial class Window06 : Window
      {
        public Window06()
        {
          InitializeComponent();
          this.DataContext = this;
        }
    
        public ObservableCollection<MeineKlasse> MeineListe { get; set; } = new ObservableCollection<MeineKlasse>();
        int zaehler = 1;
    
        private void Button_Click_1(object sender, RoutedEventArgs e)=>      MeineListe.Clear();
    
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
          MeineListe.Add(new MeineKlasse() { ID = zaehler, Info = $"Zeile {zaehler}" });
          zaehler++;
        }
    
        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
          List<MeineKlasse> zws = new List<MeineKlasse>();
          foreach (MeineKlasse item in dg.SelectedItems) zws.Add(item);
          foreach (var item in zws)MeineListe.Remove(item);
        }
    
        public class MeineKlasse
        {
          public int ID { get; set; }
          public string Info { get; set; }
        }
      }
    }


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 30. Juli 2017 06:51
  • Hallo Torsten,

    schau mal bitte, ob Du nicht irgendwo die Instanz von "meineListe" erneuerst, also bspw. meineListe = new ObservableCollection<MeineKlasse>() oder ähnliches stehen hast.

    Was mir noch auffällt: Du hast im Binding "MeineListe", also mit großem "M", im Code aber "meineListe" mit kleinem "m". Ist letzteres nur die Membervariable zur Eigenschaft oder schiebst Du die Elemente in der Liste evtl. von Hand (also irgendwo per Code) hin und her?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Sonntag, 30. Juli 2017 06:59
  • Hallo, Danke für den Denkanstoss.

    Es war wirklich eine neue Instanz der Liste.

    Ich habe im Hauptobjekt ein Lazy-Loadung falsch implementiert:

    public ObservableCollection<DTO_Logistiker> Logistikerliste
            {
                get {
                    if(_Logistikerliste==null || _Logistikerliste.Count()==0)
                    {
                        _Logistikerliste = new ObservableCollection<DTO_Logistiker>(new StammdatenProvider().GetList_LogistikerByLogistikergruppe(this));
                    }


                    return _Logistikerliste;

                }
                set { _Logistikerliste = value; }
            }

    Er baut mir also eine neue Liste, wenn sie leer ist.

    Herzlichen Dank !!!

    Mittwoch, 2. August 2017 13:22
  • Der Schreibfehler war übrigens nur dem Pseudo-Code zu verdanken.
    Mittwoch, 2. August 2017 13:22