【发布时间】:2019-11-15 16:46:21
【问题描述】:
在 WPF 应用程序中使用 MVVM 模式,我想处理记录的“编辑状态”。
每次用户开始编辑记录时,该窗口都应该切换到“编辑”模式,这很容易在代码中由名为 IsEditing 的布尔属性表示。
这允许激活/停用 UI 按钮等。
我知道这样的属性应该进入 ViewModel。
但是如何确保用户开始编辑其中一个字段时,IsEditing 设置为 true?
我发现的唯一方法是将IsEditing 显式分配到模型字段的包装器中。
有没有更好、更聪明的方法来做到这一点,也许是集中式的?我在我的方法中看到的缺点是冗长并且可能忘记为某个字段这样做。
也许有一种完全不同的方法可以从一开始就处理这样的问题?
我的模型(Entity Framework Core,虽然应该无关紧要):
public class City
{
public string Id { get; set; }
public string Name { get; set; }
}
关联的 ViewModel(我只包含了相关代码):
public class CityVM : INotifyPropertyChanged
{
private bool _isEditing;
public bool IsEditing
{
get { return _isEditing; }
set
{
if (value!=_isEditing)
{
_isEditing = value;
NotifyPropertyChanged();
}
}
}
public string Name
{
get { return _model.Name; }
set
{
if (value!=_model.Name)
{
_model.Name = value;
NotifyPropertyChanged();
IsEditing = true;
}
}
}
}
【问题讨论】:
-
就其价值而言,您的 VM 没有任何意义。唯一能让你免于堆栈溢出的方法是检查
IsEditing是否不同,因为你在 setter 中用 true 覆盖了来自用户的值。 -
你说得对,直接在stackoverflow上编辑代码是个错误。 IsEditing 由任何其他属性设置,但显然不是由其自身设置。我现在已经更正了。