【发布时间】: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 Request和Request EditingRequest。当用户开始编辑Request时,他们实际上是在编辑EditingRequest中的一个克隆。当他们点击保存时,Request被替换为EditingRequest的新克隆。如果他们改为点击取消,EditingRequest将替换为Request的新克隆。这对我来说已经足够优雅了。如果您感觉精力充沛,您也可以通过这种方式给他们一个撤消/重做堆栈。 . -
也许
Request不是您想要保存/恢复的状态单位;如果您只使用RequestStatus枚举的值而不是Request的实例,则同样的原则适用。 -
我正在考虑做类似的事情,但我是 mvvm 和 wpf 的新手,所以我不完全确定这是处理它的标准方法还是最佳实践。感谢您的建议!
标签: c# wpf data-binding mvvm-light