我遇到绑定字典的问题,删除并添加元素到字典。
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
答案 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