none
WPF DataGrid Liste als Content zu weisen RRS feed

  • Frage

  • Hi,

    ich habe schon mehrere DataGrids erstellt, aber irgendwie ist heute der Wurm drin.
    Bitte kann jemand drüber schauen, warum die Liste nicht im DataGrid angezeigt wird?!
    xaml:

    <Window x:Class="Test.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <DataGrid Name="dgr" ItemsSource="{Binding}"  />
    </Window>
    Codebehind:
    using System.Collections.Generic;
    using System.Windows;
    
    namespace Test
    {
        public partial class MainWindow : Window
        {
            private List<Werte> liste = new List<Werte>();
    
            public MainWindow()
            {
                InitializeComponent();
    
                liste.Add(new Werte() { ID = 1, zahl = 1.2, wort = "Hallo," });
                liste.Add(new Werte() { ID = 2, zahl = 2.34, wort = "wie" });
                liste.Add(new Werte() { ID = 3, zahl = 3.21, wort = "geht" });
                liste.Add(new Werte() { ID = 4, zahl = 4.321, wort = "es?" });
    
                //dgr.DataContext = liste;
                dgr.ItemsSource = liste;
            }
        }
    
        public class Werte
        {
            public int ID;
            public string wort;
            public double zahl;
        }
    }




    <Window x:Class="Test.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <DataGrid Name="dgr" ItemsSource="{Binding}" /> </Window>
    <Window x:Class="Test.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <DataGrid Name="dgr" ItemsSource="{Binding}" /> </Window>

    www.mehlhop.com

    Mittwoch, 12. Februar 2014 14:52

Antworten

  • Hallo,

    Du brauchst die Bindung an den Datenkontext nicht, wenn Du ItemsSource im CodeBehind schon manuell setzt. Allgemein ist die Variante mit Bindung aber schöner. Dazu musst Du nicht ItemsSource, sondern den DataContext des Windows-Objekts setzen. Statt "dgr.DataContext = liste;" also bloß "DataContext = liste;".

    Weiter kann WPF nur an Eigenschaften, nicht aber an öffentliche Felder binden. Die Felder der Werte-Klasse sollten also hinter Eigenschaften gekapselt werden:

       public class Werte
        {
            public int Id { get; set; }
            public string Wort { get; set; }
            public double Zahl { get; set; }
        }
    

    Auch solltest Du nicht List<T> sondern ObservableCollection<T> verwenden, damit nachträgliche Änderungen in der Liste automatisch angezeigt werden:

    private IList<Werte> liste = new ObservableList<Werte>();
    

    Damit sollte es klappen.

    Viele Grüße,
    Henning Dieterichs
    MSDN Hotline für MSDN Online Deutschland

    Disclaimer:
    Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
    Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN Hotline: http://www.msdn-online.de/Hotline
    MSDN Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    Es gelten für die MSDN Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu MarkenzeichenInformationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN Hotline.

    • Als Antwort markiert frank me Donnerstag, 13. Februar 2014 07:26
    Mittwoch, 12. Februar 2014 15:17

Alle Antworten

  • Hallo,

    Du brauchst die Bindung an den Datenkontext nicht, wenn Du ItemsSource im CodeBehind schon manuell setzt. Allgemein ist die Variante mit Bindung aber schöner. Dazu musst Du nicht ItemsSource, sondern den DataContext des Windows-Objekts setzen. Statt "dgr.DataContext = liste;" also bloß "DataContext = liste;".

    Weiter kann WPF nur an Eigenschaften, nicht aber an öffentliche Felder binden. Die Felder der Werte-Klasse sollten also hinter Eigenschaften gekapselt werden:

       public class Werte
        {
            public int Id { get; set; }
            public string Wort { get; set; }
            public double Zahl { get; set; }
        }
    

    Auch solltest Du nicht List<T> sondern ObservableCollection<T> verwenden, damit nachträgliche Änderungen in der Liste automatisch angezeigt werden:

    private IList<Werte> liste = new ObservableList<Werte>();
    

    Damit sollte es klappen.

    Viele Grüße,
    Henning Dieterichs
    MSDN Hotline für MSDN Online Deutschland

    Disclaimer:
    Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
    Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN Hotline: http://www.msdn-online.de/Hotline
    MSDN Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    Es gelten für die MSDN Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu MarkenzeichenInformationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN Hotline.

    • Als Antwort markiert frank me Donnerstag, 13. Februar 2014 07:26
    Mittwoch, 12. Februar 2014 15:17
  • Hallo,
    ein ganz einfaches Problem ;)
    Werte muss Eigenschaften besitzen, keine Felder:

       public class Werte
        {
            public int ID {get; set; }
            public string wort {get; set; }
            public double zahl {get; set; }
        }

    Dann funktioniert es.

    Noch ein kleiner Hinweis: das setzen von ItemsSource im XAML kannst du dir sparen, wenn du es sowieso im Codebehind machst.
    Alternativ kannst du aber auch {Binding Liste} für ItemsSource im XAML angeben und im Codebehind den DataContext setzen:

    this.DataContext = this;//Im Konstruktor
    Liste muss dann eine öffentliche Eigenschaft ind er Klasse sein:
    public List<Werte> Liste { get; set; }
    Das macht aber keinen Unterschied zu der von dir gezeigten Lösung.

    Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Mittwoch, 12. Februar 2014 15:23
    Moderator
  • Vielen herzlichen Dank Henning und Tom,
    ich habe da glaube Essentielles über DataGrid's gelernt.
    Das werde ich mir merken.

    Danke! :)
    Frank


    www.mehlhop.com

    Donnerstag, 13. Februar 2014 07:28