gpt4 book ai didi

c# - 如何在使用嵌套属性计算值的只读属性上触发 INotifyPropertyChanged

转载 作者:太空宇宙 更新时间:2023-11-03 10:52:33 25 4
gpt4 key购买 nike

我的问题与此类似INotifyPropertyChanged and calculated property

我重用了上面示例中的一些代码,因为它更容易理解正在发生的事情。

假设我从类似的东西开始。请注意,INotifyPropertyChangedBase 是我用来实现 INotifyPropertyChanged 的​​基类。

public class Order : INotifyPropertyChangedBase
{
private string itemName;
public string ItemName
{
get { return itemName; }
set
{
itemName = value;
}
}

private decimal itemPrice;
public decimal ItemPrice
{
get { return itemPrice; }
set
{
itemPrice = value;
}
}

private int quantity;
public int Quantity
{
get { return quantity; }
set
{
quantity= value;
OnPropertyChanged("Quantity");
OnPropertyChanged("TotalPrice");
}
}

public decimal TotalPrice
{
get { return ItemPrice * Quantity; }
}
}

在生成与此类似的代码后,我意识到每个订单都可以由多个 Items 组成,所以我生成了一个 class : Item 类似于:

public class Item : INotifyPropertyChangedBase
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}

private decimal price;
public decimal Price
{
get { return price; }
set { price = value; }
}

private int quantity;
public int Quantity
{
get { return quantity; }
set
{
quantity = value;
OnPropertyChanged("Quantity");
}
}
}

然后我将我的 Order 类转换为如下所示。

public class Order : INotifyPropertyChangedBase
{
private ObservableCollection<Item> itemInfo;
public ObservableCollection<Item> ItemInfo
{
get { return itemInfo; }
set
{
itemInfo = value;
OnPropertyChanged("ItemInfo");
OnPropertyChanged("TotalPrice");
}
}

public decimal TotalPrice
{
get
{
Decimal totalPrice;
foreach (Item item in ItemInfo)
{
totalPrice += item.Quantity * item.Price;
}
return totalPrice;
}
}
}

这是通过 DataGrid 实现的。每个 Order 都是一行。我将列标题绑定(bind)到 Item.Name(有限数量的选项)并将 Item.Quantity 绑定(bind)到相应的列单元格。最后一列是 TotalPrice

以前,TotalPrice 会在我更改 Quantity 时更新。现在,随着使用 Item 的新实现,TotalPrice 将不会在 DataGrid 中更新。当我更新 Item.Quantity 的实例时,ItemInfo 的 setter 似乎不会触发。当我更新相应的 DataGrid 单元格时,Item.Quantity 上的 setter 会触发。

如何获取只读属性 (TotalPrice) 的值以使用嵌套属性 (Item) 进行更新?

最佳答案

您将不得不像听 ItemInfo 的 CollectionChanged

public class Order : INotifyPropertyChangedBase
{
public Order()
{
ItemInfo =new ObservableCollection<Item>();
ItemInfo.CollectionChanged += ItemInfo_CollectionChanged;

}

void ItemInfo_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
OnPropertyChanged("TotalPrice");
}

private ObservableCollection<Item> itemInfo;
public ObservableCollection<Item> ItemInfo
{
get { return itemInfo; }
set
{
itemInfo = value;
OnPropertyChanged("ItemInfo");
OnPropertyChanged("TotalPrice");
}

}

OR

public class Order : INotifyPropertyChangedBase
{

void ItemInfo_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
OnPropertyChanged("TotalPrice");
}

private ObservableCollection<Item> itemInfo;
public ObservableCollection<Item> ItemInfo
{
get { return itemInfo; }
set
{
if(itemInfo!=null)
itemInfo.CollectionChanged -= ItemInfo_CollectionChanged;

itemInfo = value;

if(itemInfo!=null)
itemInfo.CollectionChanged += ItemInfo_CollectionChanged;

OnPropertyChanged("ItemInfo");
OnPropertyChanged("TotalPrice");
}

关于c# - 如何在使用嵌套属性计算值的只读属性上触发 INotifyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20909292/

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