我有一个用户控件,其中包含一个从枚举中获取其值的组合框。我将该组合框绑定到模型的属性。每当我更改组合框的选择时,它也会更改模型的属性。我希望能够实现一个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
}
答案 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();
}
}