WPF - 当我从字典中删除项目时,不刷新DataGrid中的数据

时间:2014-12-28 13:01:47

标签: c# wpf dictionary datagrid

我遇到绑定字典的问题,删除并添加元素到字典。

1号:

我有一个名为' 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
}

此元素的观察者:

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);
        }


    }

}

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

PS。 Sory我的英文:P

1 个答案:

答案 0 :(得分:2)

不是这样的方式。

这没有任何意义 您只需要删除一次密钥

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);

看一下keyedcollection