INotifyCollectionChanged kłopot odświerzaniem binding

0

Witam problem jest w odświeżaniu kontrolki listview kontrolka jest zbindowana z listą obiektów, która ma zaimplementowaną klasę INotifyCollectionChanged. kontrolka nie jest odświeżana gdy zmieniam listę obiektów kod poniżej;

xaml

<Window x:Class="namiastka_crm.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:namiastka_crm"
Title="Namiastka CRM EA24" Height="485" Width="874" Loaded="Window_Loaded">
<DockPanel >
<Grid DockPanel.Dock="Top" Height="36">
<Menu HorizontalAlignment="Right" Height="36" VerticalAlignment="Top" Width="54">
<MenuItem x:Name="menuItem" Header="Opcje" Height="36" Width="54" RenderTransformOrigin="0.5,0.5">
<MenuItem.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</MenuItem.RenderTransform>
<MenuItem Header="Kontrahenci" ToolTip="Lista kontrahentów. Dodawanie, edytowanie i usuwanie konrtahentów" Click="MenuItem_Click" Height="26" Background="#FF89BCE6" BorderBrush="#FF89BCE6" Foreground="#FF740000">
<MenuItem.Icon>
<Image Source="image/plus.png" Width="auto" Height="auto" Margin="-3,0,-9,0"/>
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Generuj nowy miesiąc" ToolTip="test" Click="MenuItem_Click_1" Height="26" Background="#FF89BCE6" BorderBrush="#FF89BCE6" Foreground="#FF740000">
<MenuItem.Icon>
<Image Source="image/plus.png" Width="auto" Height="auto" Margin="-3,0,-9,0"/>
</MenuItem.Icon>
</MenuItem>
</MenuItem>
</Menu>
<ComboBox Name="cmb_miesiac" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="120" SelectedValuePath="Tag" SelectedIndex="{Binding cmb_miesiac_index}" SelectionChanged="ComboBox_SelectionChanged">
<ComboBox.Items>
<ComboBoxItem Content="Styczeń" Tag="1"/>
<ComboBoxItem Content="Luty" Tag="2"/>
<ComboBoxItem Content="Marzec" Tag="3"/>
<ComboBoxItem Content="Kwiecień" Tag="4"/>
<ComboBoxItem Content="Maj" Tag="5"/>
<ComboBoxItem Content="Czerwiec" Tag="6"/>
</ComboBox.Items>
</ComboBox>
</Grid>
<Grid DockPanel.Dock="Bottom" Height="39" >
<ProgressBar HorizontalAlignment="Right" Height="19" Margin="723,10,0,0" VerticalAlignment="Top" Width="143"/>

    </Grid>
    <Grid DockPanel.Dock="Left" Width="150">
        <Label Content="Narzędzia" HorizontalAlignment="Left" Margin="50,0,0,0" VerticalAlignment="Top"/>
        <Button Content="co wybrales" HorizontalAlignment="Left" Margin="10,26,0,0" VerticalAlignment="Top" Width="130" Height="25" Click="Button_Click"/>

    </Grid>
    <Grid>
        <ListView Name="lvLista" ItemsSource="{Binding test}"  SelectedValue="{Binding wybraneid}" SelectedValuePath="id" SelectionMode="Single">
            <ListView.View >
                <GridView >
                    <GridViewColumn Header="Nazwa" Width="auto">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="{Binding nazwa}" ToolTip="{Binding data_rachunku}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Kod świad" Width="auto">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="{Binding kod_swiad}" ToolTip="{Binding kod_swiad}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Hasło" Width="auto">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="******" ToolTip="{Binding hasło}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Zakres" Width="auto">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="{Binding zakres}" ToolTip="{Binding data_rachunku}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="ile Rachunków" Width="auto">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="{Binding ile_rachunków, StringFormat=d, ConverterCulture=en-GB}" ToolTip="{Binding data_klient}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Kolejka statystyczna data" Width="auto">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Label Content="{Binding data_kolej_stat, StringFormat=d, ConverterCulture=en-GB}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Kolejka statystyczna wysłana" Width="auto" >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding kol_stat_czy_wyslana}" Unchecked="CheckBox_Unchecked" Checked="CheckBox_Checked"  />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Kolejka statystyczna potwierdzona" Width="auto">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding kol_stat_czy_zatwierdzona}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>



</DockPanel>
</window>

cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace namiastka_crm
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public int rok {get; set; }
public int wybraneid {get;set;}
public int miesiac { get; set; }
public int cmb_miesiac_index { get; set; }
public List<lista> test { get; set; }

    public MainWindow()
    {
       miesiac= sys.aktualny_miesiąc();
       cmb_miesiac_index = miesiac - 1;
       rok = sys.aktualny_rok();
        this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);
       
       this.DataContext = this;
       // lvLista.DataContext = test;
        InitializeComponent();
        
       
        
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        
       // wyswietlanalista = admin.testowedane();
       
        
    }
    private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        Kontrahenci n = new Kontrahenci();
        n.ShowDialog();
      

      
    }

    private void Label_MouseDown(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show(e.Timestamp.ToString());
    }

    private void MenuItem_Click_1(object sender, RoutedEventArgs e)
    {
        miesiac_rok page = new miesiac_rok();
        page.ShowDialog();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(wybraneid.ToString());
    }

    private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("nie zaznaczone");
    }

    private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("zaznaczone");
    }

    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {


        miesiac = cmb_miesiac.SelectedIndex + 1;
        test = sys.listamiesiaca(miesiac, rok);

        
       // lvLista.ItemsSource = test;
       
    }


   
   


 
   
}

}

lista.cs

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace namiastka_crm
{
public class lista : INotifyCollectionChanged
{
private int ID;
public int id { get { return ID; }
set { if (ID != value)
{ ID = value;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, id));}} }
private string Nazwa;
public string nazwa { get { return Nazwa; } set { if (value != Nazwa) { Nazwa = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, nazwa)); } } }
private string Kod_swiad;
public string kod_swiad { get { return Kod_swiad; } set { if (value != Kod_swiad) { Kod_swiad = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, kod_swiad)); } } }
private string Hasło;
public string hasło { get { return Hasło; } set { if (Hasło != value) { Hasło = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, hasło)); } } }
private string Zakres;
public string zakres { get { return Zakres; } set { if (Zakres != value) { Zakres = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, zakres)); } } }
private string Nr_rahunku;
public string nr_rahunku { get { return Nr_rahunku; } set { if (Nr_rahunku != value) { Nr_rahunku = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, nr_rahunku)); } } }
private DateTime Data_rachunku;
public DateTime data_rachunku { get { return Data_rachunku; } set { if (Data_rachunku != value) { Data_rachunku = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, data_rachunku)); } } }
private DateTime Data_klient;
public DateTime data_klient { get { return Data_klient; } set { if (Data_klient != value) { Data_klient = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, data_klient)); } } }
private DateTime Data_nfz;
public DateTime data_nfz { get { return Data_nfz; } set { if (Data_nfz != value) { Data_nfz = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, data_nfz)); } } }
private int Ile_rachunków;
public int ile_rachunków { get { return Ile_rachunków; } set { if (Ile_rachunków != value) { Ile_rachunków = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, ile_rachunków)); } } }
private DateTime Data_kolej_stat;
public DateTime data_kolej_stat { get { return Data_kolej_stat; } set { if (Data_kolej_stat != value) { Data_kolej_stat = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, data_kolej_stat)); } } }
private bool Kol_stat_czy_wyslana;
public bool kol_stat_czy_wyslana { get { return Kol_stat_czy_wyslana; } set { if (Kol_stat_czy_wyslana != value) { Kol_stat_czy_wyslana = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, kol_stat_czy_wyslana)); } } }
private bool Kol_stat_czy_zatwierdzona;
public bool kol_stat_czy_zatwierdzona { get { return Kol_stat_czy_zatwierdzona; } set { if (Kol_stat_czy_zatwierdzona != value) { Kol_stat_czy_zatwierdzona = value; OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, kol_stat_czy_zatwierdzona)); } } }

    //protected void NotifyPropertyChanged(string propertyName)
    //{
    //    if (PropertyChanged != null)
    //    {
    //        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    //    }
    //}
    //public event PropertyChangedEventHandler PropertyChanged;

    public event NotifyCollectionChangedEventHandler CollectionChanged;

    private void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (CollectionChanged != null)
        {
            CollectionChanged(this, e);
        }
    }

    
}

}

jeśli zna ktos jakis inny sposób na odświerzanie z bindigiem.
gdy zmieniam wartość w combo box to lv_list sie nie zmienia

0
  1. uzywac znacznikow kolorujacych skladnie
  2. polecam ObservableCollection<T>
0

Dlaczego tworzysz List<Lista> ? Nie rozumiem tego zabiegu.

Twoja klasa "Lista" powinna implementować INotifyPropertyChange a nie INotifyCollectionChanged jeżeli chcesz aby propertasy się aktualizowały

Klasyczna LIST-a z System.Collections.Generic nie implementuje interfejsu INotifyCollectionChanged. Tak jak kolega wyżej napisał, należy użyć ObservableCollection z System.Collections.ObjectModel.

0

kombinowałem już z INotifyPropertyChanged ale nie wyszło.
przekształciłem na ObservableCollection ale dalej nie działa wszystko ładnie się ładuje ale po zmianie w Combo boxie miesiąca dalej się LvLista (ListView) nie odświeża chyba trzeba będzie w ogóle zrobić mvvm od początku do końca a nie kombinować
poniżej kod po przeróbce

cs

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace namiastka_crm
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public int rok {get; set; }
        public int wybraneid {get;set;}
        public int miesiac { get; set; }
        public int cmb_miesiac_index { get; set; }
        public ObservableCollection<lista> test { get; set; }
       
        public MainWindow()
        {
           miesiac= sys.aktualny_miesiąc();
           cmb_miesiac_index = miesiac - 1;
           rok = sys.aktualny_rok();
            this.Language = XmlLanguage.GetLanguage(Thread.CurrentThread.CurrentCulture.Name);
           
           this.DataContext = this;
           // lvLista.DataContext = test;
            InitializeComponent();
            
           
            
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            
           // wyswietlanalista = admin.testowedane();
           
            
        }
        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            Kontrahenci n = new Kontrahenci();
            n.ShowDialog();
          

          
        }

        private void Label_MouseDown(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show(e.Timestamp.ToString());
        }

        private void MenuItem_Click_1(object sender, RoutedEventArgs e)
        {
            miesiac_rok page = new miesiac_rok();
            page.ShowDialog();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(wybraneid.ToString());
        }

        private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("nie zaznaczone");
        }

        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("zaznaczone");
        }

        private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {


            miesiac = cmb_miesiac.SelectedIndex + 1;
            test = sys.listamiesiaca(miesiac, rok);
          
                        
           // lvLista.ItemsSource = test;
           
        }


       
       


     
       
    }
}

i lista.cs

 using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace namiastka_crm
{
    public class lista :  INotifyPropertyChanged
    {
       // public event PropertyChangedEventHandler PropertyChanged;

        private int ID;
        public int id { get { return ID; } set { if (ID != value)  { ID = value; NotifyPropertyChanged("id"); }} }
        private string Nazwa;
        public string nazwa { get { return Nazwa; } set { if (value != Nazwa) { Nazwa = value; NotifyPropertyChanged("nazwa"); } } }
        private string Kod_swiad;
        public string kod_swiad { get { return Kod_swiad; } set { if (value != Kod_swiad) { Kod_swiad = value; NotifyPropertyChanged("kod_swiad"); } } }
        private string Hasło;
        public string hasło { get { return Hasło; } set { if (Hasło != value) { Hasło = value; NotifyPropertyChanged("hasło"); } } }
        private string Zakres;
        public string zakres { get { return Zakres; } set { if (Zakres != value) { Zakres = value; NotifyPropertyChanged("zakres"); } } }
        private string Nr_rahunku;
        public string nr_rahunku { get { return Nr_rahunku; } set { if (Nr_rahunku != value) { Nr_rahunku = value; NotifyPropertyChanged("nr_rachunku"); } } }
        private DateTime Data_rachunku;
        public DateTime data_rachunku { get { return Data_rachunku; } set { if (Data_rachunku != value) { Data_rachunku = value; NotifyPropertyChanged("data_rachunku"); } } }
        private DateTime Data_klient;
        public DateTime data_klient { get { return Data_klient; } set { if (Data_klient != value) { Data_klient = value; NotifyPropertyChanged("data_klient"); } } }
        private DateTime Data_nfz;
        public DateTime data_nfz { get { return Data_nfz; } set { if (Data_nfz != value) { Data_nfz = value; NotifyPropertyChanged("data_nfz"); } } }
        private int Ile_rachunków;
        public int ile_rachunków { get { return Ile_rachunków; } set { if (Ile_rachunków != value) { Ile_rachunków = value; NotifyPropertyChanged("ile_rachunków"); } } }
        private DateTime Data_kolej_stat;
        public DateTime data_kolej_stat { get { return Data_kolej_stat; } set { if (Data_kolej_stat != value) { Data_kolej_stat = value; NotifyPropertyChanged("data_kolej_stat"); } } }
        private bool Kol_stat_czy_wyslana;
        public bool kol_stat_czy_wyslana { get { return Kol_stat_czy_wyslana; } set { if (Kol_stat_czy_wyslana != value) { Kol_stat_czy_wyslana = value; NotifyPropertyChanged("kol_stat_czy_wyslana"); } } }
        private bool Kol_stat_czy_zatwierdzona;
        public bool kol_stat_czy_zatwierdzona { get { return Kol_stat_czy_zatwierdzona; } set { if (Kol_stat_czy_zatwierdzona != value) { Kol_stat_czy_zatwierdzona = value; NotifyPropertyChanged("kol_stat_czy_zatwierdzona"); } } }



        protected void NotifyPropertyChanged(string propertyName)
        {
            //if (PropertyChanged != null)
            //{
            //    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            //}

            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        //public event NotifyCollectionChangedEventHandler CollectionChanged;

        //private void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        //{
        //    if (CollectionChanged != null)
        //    {
        //        CollectionChanged(this, e);
        //    }
        //}

        
    }
   
}

proszę o wytknięcie mi błędów, może po prostu zle się do tego zabrałem i po prostu przebudować program.
zapomniałe dodać że dane wyciągam z mysql sys.listamiesiaca(int miesiac, int rok);

1
MCX napisał(a):

proszę o wytknięcie mi błędów, może po prostu zle się do tego zabrałem i po prostu przebudować program.
zapomniałe dodać że dane wyciągam z mysql sys.listamiesiaca(int miesiac, int rok);

To, skad wyciagasz dane jest nieistotne, mozesz je brac skądkolwiek i jak bindingi masz poprawne o powinno działać ok.

To, co koniecznie trzeba poprawic:

  • formatowanie kodu, bo jest tragiczne
  • wymyslenie sensownego modelu, pojedynczy objekt Twojej klasy lista faktycznie jest listą, czy elementem tej listy?
  • rozroznianie tego, kiedy zmienia sie kolekcja, od tego kiedy zmienia sie obiekt kolekcji i jeszcze to trzeba odroznic od tego, kiedy zmienia się property, w ktorym przechowujesz kolekcje (3 rozne przypadki - u Ciebie zachodzi ten 3)
  • radzilbym zrobienie jakiegos, nawet prostego, mvvma. Prosty viewModel, ladne modele, itd

Btw, z tego co piszesz, oczekujesz, ze po zmianie czegos na gui, uaktualni się obiekt "pod spodem", czyli chcesz, zeby update byl target->source. Zadeklarowales bindowanie jako TwoWay w xamlu?

</quote>
0

FakeAccount masz całkowitą racje. Dziekuje wszystkim za pomoc wczoraj skończyłem wszystko pokładałem w mvvm i wszystko zaimplementowałem super działa i słuszna uwaga bindowanie TwoWay.

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