none
Liste an Listbox binden RRS feed

  • Frage

  • Hallo,

    ich wollte nun die Abfrage der zuvor im Programm erstellten Filme in einer Listbox anzeigen.

    Ich könnte einfach die Namen der Liste am Anfang als Items hinzufügen lassen, da man aber gleichzeitig die Liste offen, und ein Film hinzufügen kann, wollte ich die Listbox an die Liste binden, hier mein Verusch:

     foreach(Film tempfilm in temprequest.filmlist)
                {
                   
                    Binding listbinding = new Binding("tempfilm");
                    listbinding.ElementName = "filmlistbox";
                    Filmlistbox.SetBinding(Filmlistbox.Items, listbinding); 
    
                }

    Dieser Code funktioniert nicht, was habe ich falsch gemacht?

    LG

    Montag, 7. September 2015 16:08

Antworten

  • Hallo,

    wenn ich dich richtig stehe, möchtest du eine Liste von Objekten, in dienen Fall dein Film Objekt an eine Listbox binden. Korrekt?

    Du versuchst aktuell alle deine Elemente zu binden. Das ist falsch. Du bindest deine Liste an deine ListBox. Dazu brauchst du einfach nur die ItemsSource Eigenschaft deiner Listbox auf die List setzen.

    Filmlistbox.ItemsSource = temprequest.filmlist;
    Lg Marco

    • Als Antwort markiert R3turnz Dienstag, 8. September 2015 17:27
    Montag, 7. September 2015 17:12
  • Hi,

    Wenn Du die ganze Geschichte etwas eleganter lösen möchtest, kannst (und sollst) Du das Model View Viewmodel Pattern verwenden (MVVM):

    1. Eine ViewModel Klasse erzeugen, welche die Filmliste als ObservableCollection anbietet:

    public class MainViewModel
    {
        public MainViewModel()
        {
            //Filme laden und in Films einfügen
            Films = new ObservableCollection<Film>();
            Films.Add(new Film() { Title = "Shrek" });
        }
        public ObservableCollection<Film> Films { get; set; }
    }

    Die ObservableCollection ist eine Erweiterung von List, welche für WPF angepasst ist. Sie sorgt dafür, dass die WPF automatisch mitbekommt, wenn sich die Collection ändert.

    2. Im WindowLoaded Event das ViewModel instanzieren und als DataContext des Windows setzen:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        this.DataContext = new MainViewModel();
    }

    3. In der View (MainWindow.xaml) per DataBinding auf die Films Property im ViewModel binden:

    <Window x:Class="WpfApplication2.MainWindow"
            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:WpfApplication2"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <Grid>
            <ListBox Width="300" Height="300" ItemsSource="{Binding Films}"
                     DisplayMemberPath="Title"/>
            
        </Grid>
    </Window>

    4. Der WPF sagen, wie sie einen Film anzeigen soll. Dazu gibts 3 Möglichkeiten:

    a) Die ToString() Methode der Klasse Film überschreiben und ausgeben, was Du im UI sehen willst

    b) Den DisplayMemberPath in der ListBox auf die Property der Film Klasse setzen, die Du anzeigen willst.

    c) Ein DataTemplate verwenden.

    Zu MVVM gibts ein Haufen Literatur im Netz, Bsp:

    https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Getting-Started-with-MVVM

    Grüsse Manuel


    PS: Please mark as answer if helpful. Thanks!
    Blog: http://www.manuelmeyer.net
    Twitter: https://twitter.com/manumeyer1

    • Als Antwort markiert R3turnz Dienstag, 8. September 2015 17:27
    Montag, 7. September 2015 18:35

Alle Antworten

  • Hallo,

    wenn ich dich richtig stehe, möchtest du eine Liste von Objekten, in dienen Fall dein Film Objekt an eine Listbox binden. Korrekt?

    Du versuchst aktuell alle deine Elemente zu binden. Das ist falsch. Du bindest deine Liste an deine ListBox. Dazu brauchst du einfach nur die ItemsSource Eigenschaft deiner Listbox auf die List setzen.

    Filmlistbox.ItemsSource = temprequest.filmlist;
    Lg Marco

    • Als Antwort markiert R3turnz Dienstag, 8. September 2015 17:27
    Montag, 7. September 2015 17:12
  • Hi,

    Wenn Du die ganze Geschichte etwas eleganter lösen möchtest, kannst (und sollst) Du das Model View Viewmodel Pattern verwenden (MVVM):

    1. Eine ViewModel Klasse erzeugen, welche die Filmliste als ObservableCollection anbietet:

    public class MainViewModel
    {
        public MainViewModel()
        {
            //Filme laden und in Films einfügen
            Films = new ObservableCollection<Film>();
            Films.Add(new Film() { Title = "Shrek" });
        }
        public ObservableCollection<Film> Films { get; set; }
    }

    Die ObservableCollection ist eine Erweiterung von List, welche für WPF angepasst ist. Sie sorgt dafür, dass die WPF automatisch mitbekommt, wenn sich die Collection ändert.

    2. Im WindowLoaded Event das ViewModel instanzieren und als DataContext des Windows setzen:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        this.DataContext = new MainViewModel();
    }

    3. In der View (MainWindow.xaml) per DataBinding auf die Films Property im ViewModel binden:

    <Window x:Class="WpfApplication2.MainWindow"
            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:WpfApplication2"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
        <Grid>
            <ListBox Width="300" Height="300" ItemsSource="{Binding Films}"
                     DisplayMemberPath="Title"/>
            
        </Grid>
    </Window>

    4. Der WPF sagen, wie sie einen Film anzeigen soll. Dazu gibts 3 Möglichkeiten:

    a) Die ToString() Methode der Klasse Film überschreiben und ausgeben, was Du im UI sehen willst

    b) Den DisplayMemberPath in der ListBox auf die Property der Film Klasse setzen, die Du anzeigen willst.

    c) Ein DataTemplate verwenden.

    Zu MVVM gibts ein Haufen Literatur im Netz, Bsp:

    https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Getting-Started-with-MVVM

    Grüsse Manuel


    PS: Please mark as answer if helpful. Thanks!
    Blog: http://www.manuelmeyer.net
    Twitter: https://twitter.com/manumeyer1

    • Als Antwort markiert R3turnz Dienstag, 8. September 2015 17:27
    Montag, 7. September 2015 18:35