2016-09-20 10 views
0

私は、列挙からその値を取得するコンボボックスを含むユーザーコントロールを持っています。そのコンボボックスをモデルの属性にバインドしました。コンボボックスの選択を変更するたびに、モデルの属性も変更されます。コンボボックスで選択された値は、saveコマンドが使用されているときだけ変更され、ユーザーが変更を取り消したい場合に元のデータを保持できるように、saveコマンドを実装できます。データバインディングで元のデータを保存する

1つの解決策データを格納するために別個の属性または別個のモデルがあると思っていましたが、ハックと非常に面白くないようです。どのようにこの問題を解決しますか?私はに落ち着い

のViewModel

<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'の2つのプロパティがあります。ユーザーが 'Request'の編集を開始すると、実際には' EditingRequest'でクローンを編集しています。 Saveを押すと、 'Request'は' EditingRequest'の新しいクローンに置き換えられます。代わりにCancelを押すと、 'EditingRequest'は' Request'の新しいクローンに置き換えられます。それは私のために十分優雅です。もしあなたが気持ちがいいのであれば、その方法でアンドゥ/リドゥスタックを与えることもできます。 。 –

+0

'Request'はあなたが保存/元に戻したい状態の単位ではないかもしれません。 'Request'のインスタンスではなく' RequestStatus' enumの値だけで同じことをするなら、同じ原則が適用されます。 –

+0

私はそのようなことをやっていると思っていましたが、mvvmとwpfには新しいので、それが標準的な方法かそれを処理するベストプラクティスであるかどうかは完全にはわかりませんでした。あなたの提案をありがとう! – SirGoose

答えて

1

ソリューションはMomento design patternの実装でした。

私のモデルクラスのすべての属性のコピーを作成するのはかなり醜いので、複雑さが変化する10以上の属性があります。私が上でリンクした例は、私のコードの文脈でViewModelクラスによって表されるCareTakerクラスを使用しています。

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

冷たい、私はそれのためのパターンがあることを知らなかった。 –

関連する問題