WPF中的大量显式绑定更新
本文关键字:绑定 更新 WPF | 更新日期: 2023-09-27 18:09:01
我正在编写一个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}" />
每当我改变一个值,它在模型中更新,这是伟大的;但我也想添加一个保存/取消行为:
按"保存",只有这样,数据才会被复制到模型中,按"取消"键,数据将从模型中重新加载。
我不确定如何完成它。
我想到的一种方法是将所有绑定标记为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));
}
}
}
不更新Model
(保持值在ViewModel
水平),直到'保存',并重新加载值从Model
到ViewModel
时'取消' ?
实现此目的的另一种方法是在VM中保留并公开临时模型,并将UI与之绑定。
一旦用户单击Save,用您的临时模型值更新实际模型。如果用户单击Cancel,则只需清除临时模型值。使用实际选择的模型值不断更新临时模型。因此,您的临时模型将充当值的中间容器。