2014-12-28 69 views
0

我遇到了綁定字典問題,並刪除了字典並添加了ellements。WPF - 當我從字典中刪除項目時,不刷新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 
} 

而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,但我真的不知道如何實現我的項目。 當我改變例如Cena的數據網格通常在列更新日期但不能刪除和添加行:(

PS索裏,我的英語:第

回答

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

相關問題