gpt4 book ai didi

wpf - 如何使 View 模型和模型的集合保持同步

转载 作者:行者123 更新时间:2023-12-04 04:20:04 25 4
gpt4 key购买 nike

我正在使用 wpf 工具包数据网格来显示 AccountViewModels 的可观察集合。

问题是当我从网格中删除一个帐户时,我希望它从 ObservableCollection 中删除 - 为用户提供视觉反馈,但我希望帐户模型的基础列表保持不变,只需设置一个“IsDeleted”标志帐户模型。

然后,无论何时提交更改,我的服务都知道要在数据库中添加/更新或删除哪些帐户。

我订阅了 CollectionChanged 事件:

AccountViewModels.CollectionChanged += AccountsChanged;

然后在删除某些内容时将 View 模型的模型 isdeleted 标志设置为 true:
private void AccountsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach (AccountViewModel model in e.NewItems)
{
model.PropertyChanged += accountPropertyChanged;
model.Account.IsNew = true;
}
}
if (e.OldItems != null)
{

foreach (AccountViewModel model in e.OldItems)
{
model.PropertyChanged -= accountPropertyChanged;
model.Account.IsDeleted = true;
}
}
}

但显然这会将它从可观察集合中删除。因此,当我提交更改时,不会有设置了 IsDeleted 标志的帐户。即它们将已经被删除。
 foreach (AccountViewModel acc in m_ViewModel.AccountViewModels)
{
WorkItem workItem = null;
if(acc.Account.IsNew)
workItem = new WorkItem("Saving new account: " + acc.AccountName, "Saving new account to the database", () => Service.AddAccount(acc.Account));
else if (acc.Account.IsDeleted)
workItem = new WorkItem("Removing account: " + acc.AccountName, "Setting account inactive in the database", () => Service.RemoveAccount(acc.Account));
else if(acc.Account.IsDirty)
workItem = new WorkItem("Updating account: " + acc.AccountName, "Updating account in the database", () => Service.UpdateAccount(acc.Account));

workItems.Add(workItem);

}

那么这是否意味着我需要维护两个列表,一个是帐户模型列表,另一个是可观察的帐户 View 模型集合?这看起来很讨厌,必须有更好的方法来做到这一点。

最佳答案

我认为你不能用 ObservableCollection 更好地做到这一点,因为该类拥有自己的内部对象列表。

但是,如果您实现了一个实现 INotifyCollectionChanged 和 INotifyPropertyChanged 的​​自定义集合,您可以让它包装和过滤您的源集合。

它可以过滤 IsDeleted 标志,使这些不可见。

每当用户删除项目时,您都可以直接修改域模型,将 IsDeleted 标志设置为 true。但是,您仍然需要一个事件机制来引发适当的事件,但使用这种方法,您只有一个项目集合。

自定义集合只是域模型上的投影,并添加了事件。

关于wpf - 如何使 View 模型和模型的集合保持同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2139028/

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