WPF中的大量显式绑定更新

时间:2014-06-18 07:24:08

标签: c# wpf data-binding

我正在编写一个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));
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果不更新Model(保持ViewModel级别的值)直到'已保存',并在'已取消'时将值从Model重新加载到ViewModel '?

答案 1 :(得分:0)

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

用户单击“保存”后,使用“临时模型”值更新“实际模型”。如果用户单击“取消”,则只需清除临时模型值。使用实际选定的模型值继续更新临时模型。因此,您的临时模型将充当价值的中间容器。