2016-09-20 55 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

酷,我從來不知道有這樣的模式。 –