假设我有一个草图垫菜单。它有一个带3个切换按钮的工具栏:铅笔,钢笔,橡皮擦。任何时候都只能选择3种工具中的一种,并且没有选择的工具也是合法的选择。
我的VM支持需要跟踪所选状态。作为一个可观察的是一个很大的优势,因为其他虚拟机也需要知道状态。我想我想使用枚举。
的影响enum SelectedTool
{
None=0,
Pencil,
Pen,
Eraser
}
我试图找出使用ReactiveObject设置此VM的最佳方法。我认为SelectedTool状态变量应该是只读的并且在工具选择上设置(这应该是ObservableAsPropertyHelper吗?)。我还想将枚举的初始状态设置为None。我也不确定每个按钮是否应该有bool ReactiveProperty用于支持。如果存在那些bool支持,那么我将不得不在VM中保持状态一致,这可能是一个痛苦,因为添加了更多工具。我想知道是否有办法让我在bools上使用WhenAny来设置适当的状态。
由于
答案 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
来使这个功能完全正常,但你不会从中获得很多好处。