gpt4 book ai didi

wpf - 在MVVM中更改另一个属性时如何更改属性

转载 作者:行者123 更新时间:2023-12-03 10:53:45 24 4
gpt4 key购买 nike

我正在为项目使用WPF和MVVM。我有一个带有GridView控件的 View 。用户可以在网格 View 中插入/更新/删除。当任何 Action 发生时,更改都会反射(reflect)在ViewModel中。这部分工作正常。但是,当我想将更改保存到数据库中时,我需要一个一个地遍历ItemSource中的每个Item。这需要额外的时间才能完成。我只想处理那些已更改的项目。

为此,我在模型中添加了一个 bool 属性,以指示Item是否已更改或注释。但是问题是,无论何时更改任何其他属性,我都看不到任何设置此 bool 属性的方法。

有人可以帮我怎么做吗?

编辑
我有一个SelectedItem属性,并且我假设只要在GridView中选择一个Item,用户都将更新或插入该行。所以在SelectedItem属性上,我已将SelectedItem的 bool 属性设置为True。在循环保存记录时,我将所有在 bool 属性中具有True的记录保存。我知道这不是完美的方法,但是现在我没有其他方法可以做到这一点。你的想法?

最佳答案

您可以在模型上订阅PropertyChanged事件,并将Flag设置为True。
但是请记住,从数据库加载数据后,必须将Flag设置为false,因为模型的初始化还将调用propertychanged事件。

IsDirty-Flag类的示例:

public class Sample : INotifyPropertyChanged
{
private int id;
private string name;
private bool isDirty;

public event PropertyChangedEventHandler PropertyChanged;

public int Id
{
get { return id; }
set
{
if(id != value)
{
id = value;
RaisePropertyChanged("Id");
}
}
}

public string Name
{
get { return name; }
set
{
if (name != value)
{
name = value;
RaisePropertyChanged("Name");
}
}
}

public bool IsDirty
{
get { return isDirty; }
set
{
if (isDirty != value)
{
isDirty = value;
RaisePropertyChanged("IsDirty");
}
}
}

protected virtual void RaisePropertyChanged(string propertyName)
{
if (propertyName != "IsDirty")
{
IsDirty = true;
}

var handler = PropertyChanged;

if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}

如果使用的是ObservableCollection,则还可以添加事件处理程序以跟踪新添加或删除的行

关于wpf - 在MVVM中更改另一个属性时如何更改属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12721826/

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