Jak przekazać listę oraz wyświetlić ją w listbox

0

Mam klasę drink (ma ona tam nazwy, składniki, opisy drinków). Mam listę obiektów w tej klasie, wczytane są z pliku xml. Teraz chciałbym przekazać jakoś te nazwy z tej klasy do klasy która odpowiada za okno i uzupełnić listboxa. Potem chcę zrobić że po zaznaczeniu wybranego przepisu uzupełni się reszta formularza. Nie wiem za bardzo jak uzupełnić listboxa. Czy przekazać całą listę do nowej listy, czy przekazać tylko nazwy do nowej listy w klasie okna, czy można jakoś klasą drink uzupełnić ten formularz. Najlepiej jakbym mógł zobaczyć przykład. Ale sam pomysł wykonania albo naprowadzenie też by mi pomogło. Nie mam za dużego doświadczenia w programowaniu obiektowym.

0

Poczytaj o bindowaniu.

0

Wg mnie najprościej byłoby zrobić to tak:

List<Drink> twojaListaDrinkow rozumiem że masz taka kolekcję jesteś w stanie ją wypełnić obiektami typu Drink.
teraz na formie masz jakis Listbox listaDrinkow, to najlepiej byłoby przypisać jako źródło danych do tego ListBox'a:

listaDrinkow.DataSource = twojaListaDrinkow;
listaDrinkow.ValueMember = "nazwaIdentyfikujacejWlasciwosciDrink"; //tutaj to ma być właściwośc ktorej wartość jednoznacznie wskaze na konkretnie jeden drink, może to być np id Drinku, albo jego nazwa pod warunkiem ze regule masz taka ze nazwa drinkow nie moze sie powtorzyc
listaDrinkow.DisplayMember = "NazwaWlasciwosciObiektuDrinkKtoraMaBycWysietlanaWListBox'ie";    

Powyzej masz sposob jak wypełnić ListBox drinkami, zaznaczony drink identyfikujesz przez klikniecie na niego w ListBoxie i w obsłudze zdarzenia SelectedValueChanged tego ListBoxa wyciagasz SelectedValue czyli ten unikalny identyfikator drinka, za jego pomoca odnajdujesz cały obiekt Drink w lisie tych obiektów i z gotowego obiektu Drink wyciagasz i wypełniasz pozostałe pola na formie.

Oczywiscie w tym sposobie przekazujesz duzo danych do ListBoxa a korzystasz tylko z 2 wlasciwosci tych obiektow, ale wydaje mi sie ze to jest tak najprosciej i najszybciej do zrobienia, jak ogarniesz to, to wtedy zainteresuj sie właśnie bindowaniem.

2

Czy ja wiem da się prościej i bez zabawy ze zdarzeniami:
Kod XAML:

<Window x:Class="DrinkProj.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">
    <Grid>
      <StackPanel>
         <ComboBox x:Name="DrinksList" ItemsSource="{Binding Drinks}" DisplayMemberPath="Name" SelectedValuePath="Name" />
         <TextBox Text="{Binding SelectedItem.Price, ElementName=DrinksList}"/>
      </StackPanel>   
   </Grid>
</Window>

Kod C#:

using System.Collections.Generic;
using System.Windows;

namespace DrinkProj
{
   public partial class MainWindow : Window
   {
      public MainWindow()
      {
         InitializeComponent();
         DataContext = this;
         Drinks = new List<Drink>
         {
            new Drink { Name = "Drink 1", Price = 123},
            new Drink { Name = "Drink 2", Price = 456},
            new Drink { Name = "Drink 3", Price = 567},
            new Drink { Name = "Drink 4", Price = 789},
         };
      }
      public List<Drink> Drinks { get; set; }
   }

   public class Drink
   {
      public string Name { get; set; }
      public decimal Price { get; set; }
   }
}
0
Varran napisał(a):

Wg mnie najprościej byłoby zrobić to tak:

List<Drink> twojaListaDrinkow rozumiem że masz taka kolekcję jesteś w stanie ją wypełnić obiektami typu Drink.
teraz na formie masz jakis Listbox listaDrinkow, to najlepiej byłoby przypisać jako źródło danych do tego ListBox'a:

listaDrinkow.DataSource = twojaListaDrinkow;
listaDrinkow.ValueMember = "nazwaIdentyfikujacejWlasciwosciDrink"; //tutaj to ma być właściwośc ktorej wartość jednoznacznie wskaze na konkretnie jeden drink, może to być np id Drinku, albo jego nazwa pod warunkiem ze regule masz taka ze nazwa drinkow nie moze sie powtorzyc
listaDrinkow.DisplayMember = "NazwaWlasciwosciObiektuDrinkKtoraMaBycWysietlanaWListBox'ie";    

Powyzej masz sposob jak wypełnić ListBox drinkami, zaznaczony drink identyfikujesz przez klikniecie na niego w ListBoxie i w obsłudze zdarzenia SelectedValueChanged tego ListBoxa wyciagasz SelectedValue czyli ten unikalny identyfikator drinka, za jego pomoca odnajdujesz cały obiekt Drink w lisie tych obiektów i z gotowego obiektu Drink wyciagasz i wypełniasz pozostałe pola na formie.

Oczywiscie w tym sposobie przekazujesz duzo danych do ListBoxa a korzystasz tylko z 2 wlasciwosci tych obiektow, ale wydaje mi sie ze to jest tak najprosciej i najszybciej do zrobienia, jak ogarniesz to, to wtedy zainteresuj sie właśnie bindowaniem.

Twój sposób wymaga dyrektywy Windows Forms. Mój projekt jest w wpf a zawartość okna to usercontrol ponieważ tak przełączam sobie strony w oknie.

Zauważyłem że przykładach że lista jest zadeklarowana w klasie okna, nie w klasie drink. A uzupełnianie listy obiektami drink mam w klasie drink. Czy prawidłowo programując obiektowo, wszystko powinienem mieć w klasie okna (w sensie wczytywanie XML, uzupełnianie listy, modyfikowanie obiektów drink) a w klasie drink mieć tylko parametry obiektu drink? Jak to powinno wyglądać profesjonalnie?

0

Wszystko powinno być odzienie. Poczytaj o wzorcu MVVM. Najlepszy wzorzec architektury jak używa się WPFa.
http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx

0

No właśnie oddzielnie, dlatego nie wiem jak to zrobić. Bo jak zrobiłem sposobem DibbyDum podziałało.

0

Dlatego jak chcesz "pro" to poczytaj opis wzorca + jakieś tutoriale. Przykładów na necie multum.

1 użytkowników online, w tym zalogowanych: 0, gości: 1