2016-09-20 87 views
0

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

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

视图模型

<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

如果你想有一些特定的状态的多个版本,并且要保存/恢复这种状态,那么你应该把它放在一个班。你将有两个属性:Request Request和Request EditingRequest。当用户开始编辑Request时,他们实际上是在EditingRequest中编辑一个克隆。当他们点击Save时,'Request'被替换为'EditingRequest'的新克隆。如果他们点击取消,则用'Request'的新克隆替换'EditingRequest'。这对我来说足够优雅。如果你感觉轻快,你也可以给他们一个撤销/重做堆栈。 。 –

+0

也许'请求'不是你想要保存/恢复的状态单元;如果只使用'RequestStatus'枚举的值而不是'Request'的实例来应用相同的原则。 –

+0

我正在考虑做类似的事情,但我对mvvm和wpf很陌生,所以我不完全确定这是否是标准方式或最佳做法来处理这种情况。感谢您的建议! – SirGoose

回答

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(); 
    } 
} 
+0

酷,我从来不知道有这样的模式。 –