我正在编写一个WPF应用程序,其中有几个模型。 每个型号都有一个编辑器控件,我可以使用它来查看&编辑该模型的对象。
例如:
<Label Content="{Binding ID}" />
<TextBox Text="{Binding FirstName}" />
<TextBox Text="{Binding LastName}" />
<TextBox Text="{Binding Department}" />
<TextBox Text="{Binding TelephoneNumber}" />
<xceed:ByteUpDown Value="{Binding AccessLevel1}" Maximum="64" />
<xceed:ByteUpDown Value="{Binding AccessLevel2}" Maximum="64"/>
<xceed:IntegerUpDown Value="{Binding PIN}" />
<xceed:IntegerUpDown Value="{Binding KeyCode}" />
<xceed:IntegerUpDown Value="{Binding UserLimit}" />
每当我更改一个值时,它都会在模型中更新,这很棒;但我也想要添加保存/取消行为:
开&#34;保存&#34;,只有这样,数据才会被复制到模型中, 并在&#34;取消&#34;,数据将从模型重新加载。
我不确定如何实现它。
我想到的一种方法是标记所有绑定w / UpdateSourceTrigger=Explicit
,但它需要大量的样板代码来更新源代码并且它会变得有点麻烦,因为某些模型具有20多个可编辑属性
有更好的方法吗?
修改 我想也许有人在将来阅读这篇文章会希望得到我用过的解决方案。
鉴于class Key
:
class Key
{
private KeyViewModel viewModel;
public KeyViewModel ViewModel
{
get
{
if (viewModel == null)
viewModel = new KeyViewModel(this);
return viewModel;
}
}
// -=-=- Lots & lots of properties -=-=- //
}
public class KeyViewModel : Key
{
public Key Parent { get; set; }
public KeyViewModel(Key parent)
{
Parent = parent;
CopyFromModel();
}
public void CopyToModel()
{
Type t = typeof(Key);
var props = t.GetProperties();
foreach (var p in props)
{
if (p.CanWrite)
p.SetValue(Parent, p.GetValue(this));
}
}
public void CopyFromModel()
{
Type t = typeof(Key);
var props = t.GetProperties();
foreach (var p in props)
{
if (p.CanWrite)
p.SetValue(this, p.GetValue(Parent));
}
}
}
答案 0 :(得分:2)
如果不更新Model
(保持ViewModel
级别的值)直到'已保存',并在'已取消'时将值从Model
重新加载到ViewModel
'?
答案 1 :(得分:0)
实现此目的的另一种方法是在VM上保留和公开临时模型,并将UI与之绑定。
用户单击“保存”后,使用“临时模型”值更新“实际模型”。如果用户单击“取消”,则只需清除临时模型值。使用实际选定的模型值继续更新临时模型。因此,您的临时模型将充当价值的中间容器。