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));
        }
    }
}

WPF中的大量显式绑定更新

不更新Model(保持值在ViewModel水平),直到'保存',并重新加载值从ModelViewModel时'取消' ?

实现此目的的另一种方法是在VM中保留并公开临时模型,并将UI与之绑定。

一旦用户单击Save,用您的临时模型值更新实际模型。如果用户单击Cancel,则只需清除临时模型值。使用实际选择的模型值不断更新临时模型。因此,您的临时模型将充当值的中间容器。