WPF DataGrid

0

Cześć,

mam problem z ładowaniem danych do datagrid w wpf.
W jednym user control mam dwa datagridy. Do pierwszego datagridu dane ładują się z konstruktora pomyślnie natomiast do drugiego powinny załadować się po zaznaczeniu wiersza z pierwszego datagrida.
Obsłużyłem zdarzenie, dane są wyciągane z bazy (kolekcja jest zapełniona)ale nie są jakby bindowane pomimo że ta kolekcja jest NotifyOfPropertyChange (używam Caliburn.Micro).

Prosze o pomoc , oto mój kod

XAML:

<!--Grid 1-->

<DataGrid  AutoGenerateColumns="False"  
				Style="{DynamicResource DataGridStyle1}"
				  ItemsSource="{Binding Invoices, Mode=TwoWay}"
				  SelectedItem="{Binding SelectedInvoice, Mode=TwoWay}"   
				  IsReadOnly="True"
				  CanUserAddRows="True"
				  CanUserDeleteRows="False" Grid.Column ="0" Grid.Row="0" 
					   cm:Message.Attach="[Event MouseLeftButtonUp] = [Action DispalyInvoiceItems]" 
					   >
<!--Grid 2-->
			<DataGrid  AutoGenerateColumns="False"  
				Style="{DynamicResource DataGridStyle1}"
				  ItemsSource="{Binding InvoiceItems, Mode=TwoWay}"
				  SelectedItem="{Binding SelectedInvoiceItems, Mode=TwoWay}"  
				  IsReadOnly="True"
				  CanUserAddRows="True"
				  CanUserDeleteRows="False" Grid.Column ="0" Grid.Row="2" >

C#:

 

// źródło pierwszy grid
 private BindableCollection<InvoiceModel> _invoices;
        public BindableCollection<InvoiceModel> Invoices
        {
            get { return _invoices; }
            set
            {
                _invoices = value;
                NotifyOfPropertyChange("Invoices");
            }
        }

//źródło drugi grid:

        private BindableCollection<InvoiceItemsModel> _items;
        public BindableCollection<InvoiceItemsModel> InvoiceItems
        {
            get { return _items; }
            set
            {
                _items = value;
                NotifyOfPropertyChange("InvoiceItems");
                
            }
        }


//konstruktor:

        public InvoicesViewModel()     
        {
            _invoices = new BindableCollection<InvoiceModel>();
            _invoices.AddRange(GetInvoices());     
           
        }

//Metoda wyciągająca dane do drugiego grida


         public void DispalyInvoiceItems()
        {
            _items = new BindableCollection<InvoiceItemsModel>();
            _items.AddRange(GetInvoiceItems());
        }
2

Zbinduj sobie raczej SelectedItem dla pierwszego grida i po wywołaniu NotifyOfPropertyChange zapełniaj drugiego grida odpowiednimi danymi. Zdarzenia sobie daruj, bo tutaj są niepotrzebne. Ustaw tylko sprawdzanie czy SelectedItem jest różne od null. Jeżeli jest to dopiero ładuj drugiego grida.

Kiedy ktoś za znaczy item w pierwszym gridzie to drugi z automatu uzupełni się danymi.

Pseudo_kod:

public ClassSelectedItem {
   get { return this._classSelectedItem; }
   set {
      this._classSelectedItem = value;
      this.NotifyOfPropertyChange("ClassSelectedItem");

      // tutaj wypełniaj drugiego grida
   }
}

PS: Jakbyś pozbył się magic-stringów typu "Invoices" w NotifyOfPropertyChange to też byłoby ekstra. Jest na to parę metod zależnie od wersji frameworka.

0

hej, dzięki za odpowiedź.

Zrobiłem chyba tak jak pisałeś:

 
        private InvoiceModel _invoice;    
        public InvoiceModel SelectedInvoice
        {
            get { return this._invoice; }    
            set                                                           
            {
                this._invoice = value;      
                this.NotifyOfPropertyChange("SelectedInvoice");

                if (SelectedInvoice != null)
                {
                    _items = new BindableCollection<InvoiceItemsModel>();
                    _items.AddRange(GetInvoiceItems());   
                }

            }   
        }

I faktycznie wywoływana jest metoda GetInvoiceItems() zapełnia kolekcje, ale drugi DataGrid jest nadal pusty.

Grid 1: Source: Invoices, SelectedItem: SelectedInvoices
Grid2: Source: InvoiceItems, SelectedItem: SelectedInvoiceItems

Czy w Xaml'u też trzeba coś zmienić?

0

Działa, wielkie dzięki ! :-)

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