gpt4 book ai didi

c# - 在 WPF/C# 中通知可观察集合中的项目更改

转载 作者:行者123 更新时间:2023-12-05 02:47:27 27 4
gpt4 key购买 nike

在我的 WPF 项目中,我有一个 ServiceEF模型定义为

public class Service
{
public int ID
public string Name
public decimal Price
}

在我的 View 模型中我有。

public class ReceiptViewModel : BindableBase
{
private ObservableCollection<Service> _services;
public ObservableCollection<Service> Services
{
get { return _services; }
set { SetProperty(ref _services, value, () => RaisePropertyChanged(nameof(Total))); }
}

public decimal Total => Services.Sum(s => s.Price);
}

Total 绑定(bind)到我 View 中的一个文本 block ,我的可观察集合绑定(bind)到一个带有文本框的 itemscontrol。

我希望每次用户从 UI 更改我的收藏中的价格时,我的 Total 文本 block 都会更改。我怎样才能做到这一点?

最佳答案

你应该自己实现它,我的可观察集合示例(你还需要在集合项更改时订阅和引发 OnPropertyChanged(nameof(Total))),或者将我的 collectionEx 实现更改为引发集合更改事件。

    public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged
{
public ObservableCollectionEx(IEnumerable<T> initialData) : base(initialData)
{
Init();
}

public ObservableCollectionEx()
{
Init();
}

private void Init()
{
foreach (T item in Items)
item.PropertyChanged += ItemOnPropertyChanged;

CollectionChanged += FullObservableCollectionCollectionChanged;
}

private void FullObservableCollectionCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (T item in e.NewItems)
{
if (item != null)
item.PropertyChanged += ItemOnPropertyChanged;
}
}

if (e.OldItems != null)
{
foreach (T item in e.OldItems)
{
if (item != null)
item.PropertyChanged -= ItemOnPropertyChanged;
}
}
}

private void ItemOnPropertyChanged(object sender, PropertyChangedEventArgs e)
=> ItemChanged?.Invoke(sender, e);

public event PropertyChangedEventHandler ItemChanged;
}

关于c# - 在 WPF/C# 中通知可观察集合中的项目更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64982977/

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