在ViewModel上使用ObservableAsPropertyHelper和this.WhenAny的正确方法

时间:2014-12-23 16:53:37

标签: mvvm reactiveui

假设我有一个草图垫菜单。它有一个带3个切换按钮的工具栏:铅笔,钢笔,橡皮擦。任何时候都只能选择3种工具中的一种,并且没有选择的工具也是合法的选择。

我的VM支持需要跟踪所选状态。作为一个可观察的是一个很大的优势,因为其他虚拟机也需要知道状态。我想我想使用枚举。

的影响
enum SelectedTool
{
  None=0,
  Pencil,
  Pen,
  Eraser
}

我试图找出使用ReactiveObject设置此VM的最佳方法。我认为SelectedTool状态变量应该是只读的并且在工具选择上设置(这应该是ObservableAsPropertyHelper吗?)。我还想将枚举的初始状态设置为None。我也不确定每个按钮是否应该有bool ReactiveProperty用于支持。如果存在那些bool支持,那么我将不得不在VM中保持状态一致,这可能是一个痛苦,因为添加了更多工具。我想知道是否有办法让我在bools上使用WhenAny来设置适当的状态。

由于

1 个答案:

答案 0 :(得分:2)

  

我认为SelectedTool状态变量应该是readonly并在工具选择上设置(这应该是ObservableAsPropertyHelper吗?)

我实际上反过来驱动它 - 作为Enum的SelectedTool应该是Truth™的来源,并且按钮状态可以反映出来。

var pencilToggled = this.WhenAnyValue(x => x.SelectedTool == SelectedTool.Pencil);

// We can only toggle Pencil when it's not currently toggled
var togglePencil = ReactiveCommand.Create(pencilToggled.Select(x => x != true));
togglePencil.Subscribe(_ => this.SelectedTool = 
    (this.SelectedTool == SelectedTool.Pencil ? SelectedTool.None : SelectedTool.Pencil));

你可以变得非常聪明并使用四个命令+ Merge + ToProperty来使这个功能完全正常,但你不会从中获得很多好处。