gpt4 book ai didi

c# - ObservableCollection.CollectionChanged 未触发

转载 作者:行者123 更新时间:2023-11-30 13:47:43 34 4
gpt4 key购买 nike

我有以下界面:

DataGrid

当一个项目被添加到DataGrid中时,Total列将根据(价格*数量)和总TextBox更新还将添加所有行的总数。

但是,当我更改一行的数量时,Total 列 会更新,但总计 TextBox 不会。

这是我的代码,在此先感谢。

 public partial class pgCheckout : Page {

ObservableCollection<SaleItem> items = new ObservableCollection<SaleItem>();

public pgCheckout() {
InitializeComponent();
dgItems.ItemsSource = items;
dgItems.Loaded += SetMinWidths;
items.CollectionChanged += setTotal;
}

public void setTotal(object source, EventArgs e) {
decimal total = 0;
foreach(SaleItem i in items) {
total += i.Total;
}

txtTotal.Text = total.ToString();
}


public void SetMinWidths(object source, EventArgs e) {
foreach (var column in dgItems.Columns) {
if (column.DisplayIndex != 0) {
column.MinWidth = column.ActualWidth;
column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
}
}
}

private void btnRemove_Click(object sender, RoutedEventArgs e) {
items.RemoveAt(dgItems.SelectedIndex);
}

private void btnAdd_Click(object sender, RoutedEventArgs e) {
bool exist = false;
foreach (SaleItem i in items) {
if (i.ItemID.Equals(txtItemID.Text))
exist = true;
}

if (exist) {
lblErr.Content = "Item already exist";
txtItemID.Text = "";
}

else {

using (var db = new PoSEntities()) {
var query = from i in db.Items
where i.ItemID.Equals(txtItemID.Text.Trim())
select i;
var itm = query.FirstOrDefault();
if (itm == null) {
lblErr.Content = "Invalid Item";
txtItemID.Text = "";
}
else {
txtItemID.Text = "";
lblErr.Content = "";
items.Add(new SaleItem() {
Num = items.Count + 1,
ItemID = itm.ItemID,
Name = itm.Name,
Price = decimal.Round(itm.Price, 2, MidpointRounding.AwayFromZero),
Quantity = 1,
});
}
}
}
}

private void txtItemID_KeyUp(object sender, KeyEventArgs e) {
if (e.Key == System.Windows.Input.Key.Enter) {
btnAdd_Click(txtItemID, e);
}
}
}

class SaleItem : INotifyPropertyChanged {
public int Num { get; set; }
public string ItemID { get; set; }
public string Name { get; set; }

private decimal price;
public decimal Price {
get { return price; }
set {
this.price = value;
OnPropertyChanged("Total");
}
}
public int quantity;
public int Quantity {
get { return quantity; }
set {
this.quantity = value;
OnPropertyChanged("Total");
}
}

public decimal Total {
get { return decimal.Round(Price * Quantity, 2, MidpointRounding.AwayFromZero); }
}

public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName) {
var handler = PropertyChanged;
if (handler != null) {
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}

最佳答案

ObservableCollection.CollectionChanged 当从集合中添加或删除某些内容而不是正在更新的单个成员时触发。

...
else
{
txtItemID.Text = "";
lblErr.Content = "";
SaleItem newItem = new SaleItem() {
Num = items.Count + 1,
ItemID = itm.ItemID,
Name = itm.Name,
Price = decimal.Round(itm.Price, 2, MidpointRounding.AwayFromZero),
Quantity = 1 };
newItem.PropertyChanged +=
new PropertyChangedEventHandler(newSaleItem_PropertyChanged);

items.Add(newItem);
}
...

这是 newSaleItem_PropertyChanged:

void newSaleItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
setTotal(null, null);
}

关于c# - ObservableCollection.CollectionChanged 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15698195/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com