【问题标题】:Saving Original Data with Data-Bindings使用数据绑定保存原始数据
【发布时间】:2016-09-21 04:45:07
【问题描述】:

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

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

视图模型

<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;}
    .......
}

请求状态

public enum RequestStatus
{
    Created,
    Prepared,
    Delivered
}

【问题讨论】:

  • 如果你想拥有某个给定状态的多个版本,并且你想保存/恢复那个状态,那么你应该把它放在一个类中。您将拥有两个属性:Request RequestRequest EditingRequest。当用户开始编辑Request 时,他们实际上是在编辑EditingRequest 中的一个克隆。当他们点击保存时,Request 被替换为 EditingRequest 的新克隆。如果他们改为点击取消,EditingRequest 将替换为 Request 的新克隆。这对我来说已经足够优雅了。如果您感觉精力充沛,您也可以通过这种方式给他们一个撤消/重做堆栈。 .
  • 也许Request 不是您想要保存/恢复的状态单位;如果您只使用 RequestStatus 枚举的值而不是 Request 的实例,则同样的原则适用。
  • 我正在考虑做类似的事情,但我是 mvvm 和 wpf 的新手,所以我不完全确定这是处理它的标准方法还是最佳实践。感谢您的建议!

标签: c# wpf data-binding mvvm-light


【解决方案1】:

我选择的解决方案是实现Momento design pattern

由于在我的模型类中创建每个属性的副本会相当难看,因此有 10 多个属性的复杂性各不相同。我在上面链接的示例使用了 CareTaker 类,在我的代码上下文中,它由 ViewModel 类表示。

请求时刻

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

【讨论】:

  • 酷,我从来不知道有这样的模式。
猜你喜欢
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2023-04-06
  • 2021-12-13
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多