用数据绑定保存原始数据

本文关键字:原始数据 保存 数据绑定 | 更新日期: 2023-09-27 18:07:53

我有一个用户控件,它包含一个组合框,从枚举中获取其值。我已经将这个组合框绑定到模型的一个属性上。每当我改变组合框的选择时,它也改变了模型的属性。我希望能够实现保存命令,以便组合框所选择的值仅在使用保存命令时更改,并且如果用户想要取消更改,则可以保留原始数据。

我想到的一个解决方案是使用单独的属性或单独的模型来包含数据,但这似乎是一个hack,而且非常不优雅。你会如何解决这个问题?

视图模型

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

用数据绑定保存原始数据

我确定的解决方案是实现Momento设计模式。

因为在我的模型类中创建每个单一属性的副本将是相当丑陋的,有10多个属性,它们的复杂性各不相同。我上面链接的例子使用了一个看守类,它在我的代码上下文中由一个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();
    }
}