使用数据绑定保存原始数据

时间:2016-09-20 19:00:06

标签: c# wpf data-binding mvvm-light

我有一个用户控件,其中包含一个从枚举中获取其值的组合框。我将该组合框绑定到模型的属性。每当我更改组合框的选择时,它也会更改模型的属性。我希望能够实现一个save命令,以便组合框选择的值仅在使用save命令时更改,以便在用户想要取消更改时保留原始数据。

一个解决方案我认为它具有单独的属性或单独的模型来包含数据,但它似乎是一个黑客,非常不优雅。你会如何解决这个问题?

视图模型

<StackPanel Grid.Column="1" Grid.Row="2" Margin="8, 0, 0, 0">
    <Label Content="Current Status"/>
    <ComboBox SelectedValue="{Binding SelectedRequest.CurrentStatus}" ItemsSource="{Binding Source={extension:EnumBindingSource {x:Type Requests:RequestStatus}}}"/>
</StackPanel>

请求

public class Request 
{
    public RequestStatus CurrentStatus {get; set;}
    .......
}

RequestStatus

public enum RequestStatus
{
    Created,
    Prepared,
    Delivered
}

1 个答案:

答案 0 :(得分:1)

我确定的解决方案是Momento design pattern的实现。

由于在我的模型类中创建每个属性的副本会相当难看,因此有10多个属性的复杂性各不相同。我上面链接的示例使用CareTaker类,在我的代码上下文中由ViewModel类表示。

RequestMomento

public class RequestMomento
{
    public RequestStatus Status {get; set;}

    public RequestMomento(RequestStatus status)
    {
         Status = status;   
    }
}

请求

public class Request 
{
    public RequestStatus CurrentStatus {get; set;}

    public RequestMomento SaveStateToMomento()
    {
        return new RequestMomento(CurrentStatus);
    }

    public void GetStateFromMomento(RequestMomento momento)
    {
        CurrentStatus = momento.GetStatus();
    }
}