2016-09-20 2 views
0

J'ai un contrôle utilisateur qui contient une liste déroulante qui obtient ses valeurs à partir d'une énumération. J'ai lié cette zone de liste déroulante à un attribut d'un modèle. Chaque fois que je change la sélection de la zone de liste déroulante, elle modifie également l'attribut du modèle. Je veux être en mesure d'implémenter une commande save, de sorte que la valeur sélectionnée par la zone de liste déroulante ne change que lorsqu'une commande save est utilisée et que les données d'origine puissent être conservées si l'utilisateur veut annuler la modification.Enregistrement des données d'original avec des liaisons de données

Une solution Je pensais avoir des attributs séparés ou un modèle séparé pour contenir les données, mais il semble être un hack et très inélégant. comment résoudrais-tu ce problème?

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> 

Demande

public class Request 
{ 
    public RequestStatus CurrentStatus {get; set;} 
    ....... 
} 

RequestStatus

public enum RequestStatus 
{ 
    Created, 
    Prepared, 
    Delivered 
} 
+0

Si vous voulez avoir plusieurs versions d'un état donné, et que vous souhaitez enregistrer/revenir cet état, alors vous devriez le mettre dans une classe. Vous aurez deux propriétés: 'Request Request' et' Request EditingRequest'. Lorsque l'utilisateur commence à modifier 'Request', il édite un clone dans' EditingRequest'. Quand ils cliquent sur Save, 'Request' est remplacé par un nouveau clone de' EditingRequest'. Si elles frappent Annuler à la place, 'EditingRequest' est remplacé par un nouveau clone de' Request'. C'est assez élégant pour moi. Vous pouvez également leur donner une pile d'annulation/rétablissement de cette façon si vous vous sentez bien. . –

+0

Peut-être que 'Request' n'est pas l'unité d'état que vous voulez sauvegarder/rétablir; le même principe s'applique si vous le faites uniquement avec des valeurs pour l'enum 'RequestStatus' plutôt qu'avec des instances de' Request'. –

+0

Je pensais à faire quelque chose comme ça, mais je suis nouveau sur mvvm et wpf donc je n'étais pas tout à fait sûr si c'est la manière standard ou la meilleure pratique pour gérer cela. Merci pour votre suggestion! – SirGoose

Répondre

1

Solution Je me suis installé sur était une mise en œuvre du Momento design pattern.

Étant donné que la création de copies de chaque attribut dans ma classe de modèle serait plutôt moche, il y a 10+ attributs dont la complexité est variable. L'exemple que j'ai lié ci-dessus utilise une classe CareTaker, qui dans le contexte de mon code est représentée par une classe ViewModel.

RequestMomento

public class RequestMomento 
{ 
    public RequestStatus Status {get; set;} 

    public RequestMomento(RequestStatus status) 
    { 
     Status = status; 
    } 
} 

Demande

public class Request 
{ 
    public RequestStatus CurrentStatus {get; set;} 

    public RequestMomento SaveStateToMomento() 
    { 
     return new RequestMomento(CurrentStatus); 
    } 

    public void GetStateFromMomento(RequestMomento momento) 
    { 
     CurrentStatus = momento.GetStatus(); 
    } 
} 
+0

Cool, je n'ai jamais su qu'il y avait un modèle pour ça. –