none
C#/XAML: Binding von List<> RRS feed

  • Frage

  • public class Songs
            {
    
                public string Artist { get; set; }
                public string Song { get; set; }
                public int PubDate { get; set; }
    
    
           }
    
    public class SongManager
    {
    public static List<Song> GetSongs()
    {
    var songs = new List<Song>();
    
    songs.Add(new Song { Artist = "Jackson", Song = "Beat it", PubDate = 1980});
    songs.Add(new Song { Artist = "Beatles", Song = "Wonderland", PubDate = 1967});
    songs.Add(new Song { Artist = "Elvis", Song = "Heartbreak Hotel", PubDate = 1962});
    
    return songs;
    } 
    
    
    }

    Hallo zusammen,

    ich habe ein Problem bei der Bindung von Listen.
    Ich schreibe gerade eine Art Verwaltungs-App bei der in einer Klasse eine Liste mit unterschiedlichen Songtexten verwaltet werden soll: Diese sieht wie folgt aus (steht leider über dem Text):

    Jetzt wollte ich die Liste an meine Oberfläche anzeigen lassen und zwar den Titel in einer Textbox und den Rest einem Gridview. Doch leider klappt das alles nicht so wie es soll! Kann mir von Euch vielleicht jemand weiterhelfen??

    Vielen Dank und noch einen schönen Abend.

    LG Michael

    Mittwoch, 9. März 2016 19:10

Antworten

  • Hallo Michael,

    das was fehlt ist die Zuweisung deiner Liste aus dem Quelltext an das ItemSource deiner GridView.

    Mein XAML (über x:Name vergebe ich den Namen, damit ich im Quelltext darauf zugreifen kann!)

          <GridView ItemsSource="{Binding _songs}" x:Name="GridView1">
             <GridView.ItemTemplate>
                <DataTemplate>
                   <StackPanel>
                      <TextBlock Text="{Binding SongTitle}" />
                      <TextBlock Text="{Binding Artist}" />
                      <TextBlock Text="{Binding PubDate}" />
    
                   </StackPanel>
    
                </DataTemplate>
             </GridView.ItemTemplate>
          </GridView>

    Test.cs

       public class Song
       {
          public string Artist { get; set; }
          public string SongTitle { get; set; }
          public int PubDate { get; set; }
       }
    
       public class SongManager
       {
          public static List<Song> GetSongs()
          {
             var songs = new List<Song>();
    
             songs.Add(new Song { Artist = "Jackson", SongTitle = "Beat it", PubDate = 1980 });
             songs.Add(new Song { Artist = "Beatles", SongTitle = "Wonderland", PubDate = 1967 });
             songs.Add(new Song { Artist = "Elvis", SongTitle = "Heartbreak Hotel", PubDate = 1962 });
    
             return songs;
          }
       }

    MainPage.xaml.cs

    public sealed partial class MainPage : Page
    {
       private List<Song> _song;
    
       public MainPage()
       {
          this.InitializeComponent();
          _song = SongManager.GetSongs();
          GridView1.ItemsSource = _song; // Das hier ist entscheidend!!!
       }
    }

    Ich empfehle dir, dich ein wenig mehr mit dem DataBinding auseinander zu setzen. Eine gute Einführung als Video gibt es bei der Microsoft Virtual Academy in dem Kurs XAML Deep Dive for Windows & Windows Phone Apps Jump Start und hier besonders das Video Data Binding.


    Gruß
    Rudolf

    "Der Nachteil der Intelligenz besteht darin, dass man ununterbrochen gezwungen ist, dazuzulernen." Georg Bernhard Shaw


    Donnerstag, 10. März 2016 19:55

Alle Antworten

  • Hallo Michael,

    was genau klappt nicht wie du möchtest? Werden die Daten in dem GridView und der Textbox angezeigt aber Änderungen an den Werten in der Textbox oder wenn du neue Elemente hinzufügt bzw. einen entfernst werden nicht aktualisiert?

    Wenn ja, dann solltest du die List<> durch ObservableCollection<> ersetzen und die Klasse Songs sollte die Schnittstelle INotifyCollectionChanged implementieren.

    Wenn du nach INotifyCollectionChanged und/oder ObservableCollection mit der Suchmaschine deiner Wahl suchst, wirst du so einige Beispiele finden.


    Gruß
    Rudolf

    "Der Nachteil der Intelligenz besteht darin, dass man ununterbrochen gezwungen ist, dazuzulernen." Georg Bernhard Shaw

    Mittwoch, 9. März 2016 19:44
  • Hallo Rudolf,

    leider werden mir keine Daten angezeigt:

    Meine XAML sieht wie folgt aus:

    <GridView ItemsSource="{Binding Data}">
          <GridView.ItemTemplate>
               <DataTemplate>
                   <StackPanel>
                     <TextBlock Text="{Binding Songs}" />
                      <TextBlock Text="{Binding Artist}" />
                      <TextBlock Text="{Binding PubDate}" />
    
                        </StackPanel>
                       
                    </DataTemplate>
                </GridView.ItemTemplate>
            </GridView>

    Und meiner MainPage.cs steht:

    private Liste<Song> _song;
    
    public MainPage()
    {
         this.InitializeComponent();
         _song = SongManager.GetSongs();
    }

    Nur meine MainPage bleibt beim Starten dunkel. Allerdings erhalte ich auch keine Fehlermeldung.

    LG Michael

    Donnerstag, 10. März 2016 19:16
  • Hallo Michael,

    das was fehlt ist die Zuweisung deiner Liste aus dem Quelltext an das ItemSource deiner GridView.

    Mein XAML (über x:Name vergebe ich den Namen, damit ich im Quelltext darauf zugreifen kann!)

          <GridView ItemsSource="{Binding _songs}" x:Name="GridView1">
             <GridView.ItemTemplate>
                <DataTemplate>
                   <StackPanel>
                      <TextBlock Text="{Binding SongTitle}" />
                      <TextBlock Text="{Binding Artist}" />
                      <TextBlock Text="{Binding PubDate}" />
    
                   </StackPanel>
    
                </DataTemplate>
             </GridView.ItemTemplate>
          </GridView>

    Test.cs

       public class Song
       {
          public string Artist { get; set; }
          public string SongTitle { get; set; }
          public int PubDate { get; set; }
       }
    
       public class SongManager
       {
          public static List<Song> GetSongs()
          {
             var songs = new List<Song>();
    
             songs.Add(new Song { Artist = "Jackson", SongTitle = "Beat it", PubDate = 1980 });
             songs.Add(new Song { Artist = "Beatles", SongTitle = "Wonderland", PubDate = 1967 });
             songs.Add(new Song { Artist = "Elvis", SongTitle = "Heartbreak Hotel", PubDate = 1962 });
    
             return songs;
          }
       }

    MainPage.xaml.cs

    public sealed partial class MainPage : Page
    {
       private List<Song> _song;
    
       public MainPage()
       {
          this.InitializeComponent();
          _song = SongManager.GetSongs();
          GridView1.ItemsSource = _song; // Das hier ist entscheidend!!!
       }
    }

    Ich empfehle dir, dich ein wenig mehr mit dem DataBinding auseinander zu setzen. Eine gute Einführung als Video gibt es bei der Microsoft Virtual Academy in dem Kurs XAML Deep Dive for Windows & Windows Phone Apps Jump Start und hier besonders das Video Data Binding.


    Gruß
    Rudolf

    "Der Nachteil der Intelligenz besteht darin, dass man ununterbrochen gezwungen ist, dazuzulernen." Georg Bernhard Shaw


    Donnerstag, 10. März 2016 19:55
  • Hallo Rudolf,

    vielen Dank.

    Jetzt hat alles geklappt :-)

    Viele Grüße

    Michael

    Samstag, 12. März 2016 14:14