WPF - 从字典中删除项目时不刷新数据网格中的数据

本文关键字:数据 刷新 数据网 网格 字典 删除项目 WPF | 更新日期: 2023-09-27 18:35:32

我在绑定字典和删除和添加词典时遇到问题。

第一名:

我有一个名为"Produkt"的基类

public class Produkt : ICloneable, INotifyPropertyChanged
{
    private string producent;
    public string Producent
    {
        get { return producent; }
        set { producent = value;
        OnPropertyChanged("Producent");
        }
    }

    private string nameProduct;
    public string NameProduct
    {
        get { return nameProduct; }
        set { nameProduct = value;
        OnPropertyChanged("NameProduct");
        }
    }
    private double cena;
    public double Cena
    {
        get { return cena; }
        set { cena = value;
        OnPropertyChanged("Cena");
        }
    }

    private int ilosc;
    public int Ilosc
    {
        get { return ilosc; }
        set { ilosc = value;
        OnPropertyChanged("Ilosc");
        }
    }
    private String kodKreskowy; // prawie jak xD
    public String KodKreskowy
    {
        get { return kodKreskowy; }
        set { kodKreskowy = value;
        OnPropertyChanged("KodKreskowy");
        }
    }



    protected Produkt(string Producent, string NazwaProduktu, double Cena, int Ilosc)
    {
        this.Producent = Producent;
        this.nameProduct = NazwaProduktu;
        this.ilosc = Ilosc;
        this.cena = Cena;
        this.KodKreskowy = this.ToString();
    }


    #region INTERFACE IMPLEMENTATION ICloneable
    public virtual object Clone()
    {
        return this.MemberwiseClone();
    }
    #endregion
    public override string ToString()
    {
        return GetKodKreskowy();
    }
    public string GetKodKreskowy()
    {
        return Osom.Enums.GetDescriptionFromEnumValue(Enum.Parse(Osom.MyType.GetTypeByName("AllProducts")[0], this.GetType().Name) as Enum)
            + " # " + Producent
            + " # " + NameProduct
            + " # " + Cena;
    }

    #region INTERFACE IMPLEMENTATION INotifyPropertyChanged
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}

和这个元素的Conteiner:

public class ProduktCointeiners
{
    /*
    protected List<Produkt> lista = new List<Produkt>();
    public List<Produkt> Lista
    {
        get { return lista; }
    }*/
    public Dictionary<string, Produkt> dictionary = new Dictionary<string, Produkt>();
    ObservableCollection<Produkt> obserwator;
    public List<Produkt> ToList
    {
        get {
            return dictionary.Values.ToList();
        }
        set
        {
            dictionary.Clear();
            foreach (Produkt prod in value)
            {
                dictionary.Add(prod.KodKreskowy, prod);
            }
        }
    }

    // Get Inne Prod
    #region Destroy Item
    /// <summary>
    /// Usuwa permamentnie element ze słownika
    /// </summary>
    public void DestroyProduct(Produkt product)
    {
        DestroyProduct(product.KodKreskowy);
    }
    /// <summary>
    /// Usuwa permamentnie element ze słownika
    /// </summary>
    public void DestroyProduct(string KodKreskowy)
    {
        for (int i = 0; i < dictionary.Count; i++)
        {
            dictionary.Remove(KodKreskowy);
        }
    }
    #endregion

    #region Remove
    public void RemoveProduct(Produkt product)
    {
        RemoveProduct(product.KodKreskowy, product.Ilosc);
    }

    public void RemoveProduct(string KodKreskowy, int Ilosc)
    {
        foreach (Produkt prod in dictionary.Values)
        {
            if (prod.KodKreskowy == KodKreskowy)
            {
                prod.Ilosc -= Ilosc;
                return;
            }
        }
    }
    #endregion

    #region Add
    public void AddProduct(Produkt product)
    {
        try 
        {
            dictionary[product.KodKreskowy].Ilosc += product.Ilosc;
            if (dictionary[product.KodKreskowy].Cena < product.Cena)
                dictionary[product.KodKreskowy].Cena = product.Cena;

        }
        catch(KeyNotFoundException)
        {
            dictionary.Add(product.KodKreskowy, product);
            return;
        }
    }
    #endregion

    #region Cena

    public void ChangeCost(string KodKreskowy, double Cena)
    {
        dictionary[KodKreskowy].Cena = Cena;
    }

    public void ChangeCost(Produkt product)
    {
        ChangeCost(product.KodKreskowy, product.Cena);
    }


    #endregion

    #region Ilosc
    public void Ilosc_zwieksz(Produkt product)
    {
        Ilosc_zwieksz(product.KodKreskowy, product.Ilosc);
    }

    public void Ilosc_zwieksz(string KodKreskowy, int Ilosc)
    {
        dictionary[KodKreskowy].Ilosc += Ilosc;
    }

    public void Ilosc_zmniejsz(Produkt product)
    {
        Ilosc_zmniejsz(product.KodKreskowy, product.Ilosc);
    }

    public void Ilosc_zmniejsz(string KodKreskowy, int Ilosc)
    {
        dictionary[KodKreskowy].Ilosc -= Ilosc;
        if (dictionary[KodKreskowy].Ilosc < 0)
        {
            MessageBox.Show("yyy... w Magazynie masz UJEMNE ilości przedmiotów! :D'n POZDRO!'nP.S. wartosc została zmieniona na 0");
            dictionary[KodKreskowy].Ilosc = 0;
        }
    }
    #endregion
    //#region INTERFACE IMPLEMENTATION INotifyPropertyChanged
    //protected void OnPropertyChanged(string propertyName)
    //{
    //    if (PropertyChanged != null)
    //    {
    //        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    //    }
    //}
    //public event PropertyChangedEventHandler PropertyChanged;
    //#endregion

}

和 GUI(WPF 代码):

<Window x:Class="Firma.View.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:controls="clr-namespace:Firma.View.MyControls"
        xmlns:converters="clr-namespace:Firma.View.Converters"

        Title="MainWindow" MinHeight="700" Height="700" MinWidth="800" Width="800" FontFamily="Comic Sans" FontSize="15" >
    <Window.Resources>
        <CollectionViewSource x:Key="ItemCollectionViewSource" CollectionViewType="ListCollectionView"/>
        <converters:ToCostConverter x:Key="ToCostConverter" />
        <converters:BoolToVisibilityCollapsed x:Key="BoolToVisibilityCollapsed" />
    </Window.Resources>

    <Grid Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>
        <!--MAGAZYN-->
        <GroupBox Grid.Row="0" Padding="3">         
            <GroupBox.Header>
                <TextBlock FontSize="20">Magazyn</TextBlock>
            </GroupBox.Header>
            <DockPanel Grid.Row="0">
                <TextBox Text="{Binding isPanelAdmin.ToString()}"></TextBox>

                <!--DATAGRID MAGAZYN-->
                <DataGrid DockPanel.Dock="Top" Height="Auto" Name="dg_Magazyn" Margin="10,0"
                          AutoGenerateColumns="False" 
                          ItemsSource="{Binding Source=magazyn.GetAktualnyMagazyn().dictionary.Values}" 
                          CanUserAddRows="False"
                          ScrollViewer.VerticalScrollBarVisibility="Visible"
                          SelectionUnit="FullRow" 
                          IsReadOnly="True"
                          >

                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Producent" Width="5*" Binding="{Binding Producent}"/>
                        <DataGridTextColumn Header="Nazwa produktu" Width="5*" Binding="{Binding NameProduct}" />
                        <DataGridTextColumn Header="Cena" Width="1*" Binding="{Binding Cena, Converter={StaticResource ToCostConverter}}" >
                            <DataGridTextColumn.ElementStyle>
                                <Style TargetType="TextBlock">
                                    <Setter Property="HorizontalAlignment" Value="Right" />
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>
                        <DataGridTextColumn Header="Ilość" Width="1*" Binding="{Binding Ilosc}">
                            <DataGridTextColumn.ElementStyle>
                                <Style TargetType="TextBlock">
                                    <Setter Property="HorizontalAlignment" Value="Right" />
                                </Style>
                            </DataGridTextColumn.ElementStyle>
                        </DataGridTextColumn>
                    </DataGrid.Columns>

                </DataGrid>



            </DockPanel>
        </GroupBox>

    </Grid>


</Window>

和代码隐藏:

public partial class MainWindow 
{
    public static Magazyn.AllMagazyny magazyny;
    public static Klient.Klient klient;
    public Historia.Historia historiaZakupowKlientow;
    public List<Produkt> testing = new List<Produkt>();
    public void InitializeData()
    {
        magazyny = new Magazyn.AllMagazyny(new Magazyn.Magazyn());
        klient = new Klient.Klient();
        historiaZakupowKlientow = new Historia.Historia();

        // Zmiana elementow na wszystkie z enuma
        cb_M_Type.Items.Clear();
        foreach (AllProducts typeProd in Enum.GetValues(typeof(AllProducts)))
        {
            cb_M_Type.Items.Add(Enums.GetDescriptionFromEnumValue(typeProd));
        }

        //CollectionViewSource itemCollectionViewSource;
        //itemCollectionViewSource = (CollectionViewSource)(FindResource("ItemCollectionViewSource"));
        //itemCollectionViewSource.Source = klient.ToList;


        TESTING_VALUES();
        for (int i = 0; i < 100; i++)
        {
            testing.Add(new PapierosyBezFiltra("asd", "asd", 12.2, 3));
        }
        this.dg_Magazyn.ItemsSource = magazyny.GetAktualnyMagazyn().dictionary.Values;
        this.dg_Klient.ItemsSource = klient.dictionary.Values;
    }


    public void TESTING_VALUES()
    {
        magazyny.GetAktualnyMagazyn().AddProduct(new PapierosyBezFiltra("producent1", "prod1", 12.55, 11));
        magazyny.GetAktualnyMagazyn().AddProduct(new PapierosyFiltr_Smakowy("producent2", "prod2", 22.55, 11));
        //magazyny.GetAktualnyMagazyn().AddProduct(new PapierosyFiltr_Tytoniowy("producent3", "prod3", 33, 11));
        //magazyny.GetAktualnyMagazyn().AddProduct(new PapierosyBezFiltra("producent4", "prod4", 44, 11));
        //magazyny.GetAktualnyMagazyn().AddProduct(new PapierosyBezFiltra("producent4", "prod4", 44, 11));
        //magazyny.GetAktualnyMagazyn().AddProduct(new PapierosyBezFiltra("producent4", "prod4", 44, 11));
        //magazyny.GetAktualnyMagazyn().AddProduct(new PapierosyBezFiltra("producent4", "prod4", 55, 11));
        //for (int i = 0; i < 10; i++)
        //{
        //    magazyny.GetAktualnyMagazyn().AddProduct(new PapierosyFiltr_Smakowy(i.ToString() + ". prod", "nazwa", 1.2 * i * i * i, i));
        //}
        Produkt tmp;
        foreach(Produkt prod in magazyny.GetAktualnyMagazyn().ToList)
        {
            tmp = (Produkt)prod.Clone();
            tmp.Ilosc = 1;
            klient.AddProduct(tmp);
        }

    }
}

我的问题: 当我删除字典中的某些内容时,数据网格不会刷新它... -.-我读了一些关于ObservableCollection的东西,但我真的不知道它是如何实现到我的项目中的。例如,当我更改 dataGrid Cena时,通常会更新列中的日期,但不会删除和添加行:(

PS. 为我的英语:P

WPF - 从字典中删除项目时不刷新数据网格中的数据

不是解决这个问题

的方法。

这毫无意义
您只需要删除一次密钥

public void DestroyProduct(string KodKreskowy)
{
    for (int i = 0; i < dictionary.Count; i++)
    {
        dictionary.Remove(KodKreskowy);
    }
}

只要有一个

Public ObservableCollection<Produkt> Produkts { get, set }  

无列表
无字典

对于删除,您可以使用 LINQ

Produkt p = Produkts.FirstOrDefault.Where(x => x.KodKreskowy = value);
if (p != null) Produkts.Remove(p);

并查看键控集合