MVVM - bindowanie ObservableCollection do ListView

0

Witam, mam problem z podpięciem Observable Collection do kontrolki ListView stosując bindowanie zgodne z wzorcem MVVM. Program kompiluje się i uruchamia, niestety nie pokazuje zawartości listy. Kod wygląda tak:

MainView.xaml

 
<Window x:Class="SklepTP.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SklepTP"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:DaneViewModel/>
    </Window.DataContext>
<ListView.View>
<Grid>                    <GridView>
                            <GridViewColumn DisplayMemberBinding="{Binding IdRachunkuProp}" Header="Id Rachunku" Width="110"/>
                            <GridViewColumn DisplayMemberBinding="{Binding IdKlientaProp}" Header="Id Klienta" Width="110"/>
                            <GridViewColumn DisplayMemberBinding="{Binding IdProduktuProp}" Header="Id Produktu" Width="120"/>
                            <GridViewColumn DisplayMemberBinding="{Binding KwotaProduktuProp}" Header="Kwota" Width="170"/>

                          
                    </GridView>
                </ListView.View>
            </ListView>
</Grid></Window>

DataViewModel:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.Windows.Input;

namespace SklepTP
{
    public class DaneViewModel : ViewModelBase
    {
        private Dane dane;
        public DaneViewModel()
        {
            dane = new Dane();
           
            ListaKlientow = new List<Klient>();
            ListaRachunkow = new ObservableCollection<Rachunek>();
            IWypelniacz wypelnij = new WypelniaczStaly();
            wypelnij.WypelnijKolekcjeRachunkow();
            ListaRachunkow=wypelnij.RachunkiProp;
        }
        public List<Klient> ListaKlientow
        {
            get
            {
                return dane.ListaKlientowProp;
            }
            set
            {
                dane.ListaKlientowProp = value;
                this.SetPropertyChanged("ListaKlientow");
            }
        }

        public ObservableCollection<Rachunek> ListaRachunkow
        {
            get
            {
                return dane.ListaRachunkowProp;
            }
            set
            {
                dane.ListaRachunkowProp = value;
                this.SetPropertyChanged("ListaRachunkow");
            }
        }

        public ICommand XML { get { return new RelayCommand(XMLexecute, CanXMLexecute); } }


        private bool CanXMLexecute()
        {
            return true;
        }
      


   

        private void XMLexecute()
        {
         //   IKonwerter serializerXML = new SerializacjaXML();
          //  dane.ListaKlientowProp = serializerXML.deserializujKlientow("klient.xml");    
            Klient nowy = new Klient(1, "shd", "dhf", "324554");
            Rachunek nowyr = new Rachunek(1, 222, 32, 32);
            ListaKlientow.Add(nowy);
            ListaRachunkow.Add(nowyr);
        } 
       

    }
}
0

A gdzie ustawiasz ItemsSource? Skąd listview ma wiedzieć w której kolekcji jest IdRachunkuProp?
Swoją drogą badziewne te nazwy propertek.

0
<Window x:Class="SklepTP.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SklepTP"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:DaneViewModel/>
    </Window.DataContext>
    <Grid>        
        <TabControl>
            <TabItem Header="Klienci">
              


            </TabItem>
            <TabItem Header="Produkty"></TabItem>
      <TabItem Header="Rachunki"><ListView Margin="0,2,0,4" ItemsSource="{Binding ListaKlientow}">
                <ListView.View>
                    <GridView>
                            <GridViewColumn DisplayMemberBinding="{Binding IdRachunkuProp}" Header="Id Rachunku" Width="110"/>
                            <GridViewColumn DisplayMemberBinding="{Binding IdKlientaProp}" Header="Id Klienta" Width="110"/>
                            <GridViewColumn DisplayMemberBinding="{Binding IdProduktuProp}" Header="Id Produktu" Width="120"/>
                            <GridViewColumn DisplayMemberBinding="{Binding KwotaProduktuProp}" Header="Kwota" Width="170"/>

                          
                    </GridView>
                </ListView.View>
            </ListView></TabItem>
            
        </TabControl>
    </Grid>
</Window>

Wrzuciłem poprzednią wersje wyżej, sorki. Jest i ItemSource ale i tak nie bangla :( Wrzucam cały projekt na dodatek. http://www.speedyshare.com/A5Vd7/SklepTP.rar

0

Nigdzie nie wypełniasz kolekcji.

0
    public DaneViewModel()
        {
            dane = new Dane();
           
            ListaKlientow = new List<Klient>();
            ListaRachunkow = new ObservableCollection<Rachunek>();
            IWypelniacz wypelnij = new WypelniaczStaly();
            wypelnij.WypelnijKolekcjeRachunkow();
            ListaRachunkow=wypelnij.RachunkiProp;
        }

Tutaj mam wypełnienie kolekcji.

0

Użyj debuggera, zobacz co się tam dzieje. Tam nic nie jest wypełniane.

0

Nie wiem na ile dobrze używam Debuggera ale rzeczywiście mam null w zmiennej przechowującej kolekcje rachunków... Tylko nie wiem dlaczego :( Jak na to patrze wszystko wydaje mi się dobrze napisane.

1
public void WypelnijKolekcjeRachunkow()
        {
            Int32 CzyProduktyIstnieja = Convert.ToInt32(Produkty.Any());
            Int32 CzyKlienciIstnieja = Convert.ToInt32(Klienci.Any());
            if (CzyProduktyIstnieja==0 || CzyKlienciIstnieja==0)
            {
                Console.WriteLine("Produkty lub Klienci nie istnieja, wiec tworzenie rachunkow to fanaberia. Odmawiam");
            }
            else
            {
                

                if (Rachunki.Count() == 0)
                {

                    Rachunki.Add(new Rachunek(0+LicznikUsunietychRachunkow, Produkty[0].CenaProduktuProp, 1, 2));
                    Rachunki.Add(new Rachunek(Rachunki.Count+LicznikUsunietychRachunkow, Produkty[1].CenaProduktuProp, 2, 5));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow , Produkty[2].CenaProduktuProp, 3, 3));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow , Produkty[3].CenaProduktuProp, 6, 4));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow , Produkty[4].CenaProduktuProp, 6, 1));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow , Produkty[5].CenaProduktuProp, 6, 4));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow , Produkty[6].CenaProduktuProp, 7, 5));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow , Produkty[7].CenaProduktuProp, 8, 7));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow , Produkty[8].CenaProduktuProp, 9, 7));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow, Produkty[9].CenaProduktuProp, 9, 7));
                }
                else
                {
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow , Produkty[0].CenaProduktuProp, 1, 2));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow, Produkty[1].CenaProduktuProp, 2, 5));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow, Produkty[2].CenaProduktuProp, 3, 3));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow, Produkty[3].CenaProduktuProp, 6, 4));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow, Produkty[4].CenaProduktuProp, 6, 1));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow, Produkty[5].CenaProduktuProp, 6, 4));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow, Produkty[6].CenaProduktuProp, 7, 5));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow, Produkty[7].CenaProduktuProp, 8, 7));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow, Produkty[8].CenaProduktuProp, 9, 7));
                    Rachunki.Add(new Rachunek(Rachunki.Count + LicznikUsunietychRachunkow, Produkty[9].CenaProduktuProp, 9, 7));
                 
                }
           
            }
        }

Wchodzi w

Console.WriteLine("Produkty lub Klienci nie istnieja, wiec tworzenie rachunkow to fanaberia. Odmawiam");

Nawet jak by weszło w ifa to i tak uzupełniasz zupełnie inną kolekcje.

Postaw breakpointa tu wypelnij.WypelnijKolekcjeRachunkow(); i F10/F11 analizujesz linijka po linijce co się dzieje.
F10 - następna linijka
F11 - wchodzi do metody

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