Mvvm 在ViewModel上使用ObservablesPropertyHelper和this.When的正确方法

Mvvm 在ViewModel上使用ObservablesPropertyHelper和this.When的正确方法,mvvm,reactiveui,Mvvm,Reactiveui,假设我有一个画板的菜单。它有一个带有3个切换按钮的工具栏:铅笔、钢笔、橡皮擦。任何时候都只能选择这三种工具中的一种,并且不选择任何工具也是合法的选择 我的VM备份需要跟踪所选状态。作为一个可观察的虚拟机是一个很大的优势,因为其他虚拟机也需要知道状态。我想我想使用枚举。大意是 enum SelectedTool { None=0, Pencil, Pen, Eraser } 我正在试图找出使用ReactiveObject设置此VM的最佳方法。我认为SelectedTool状态变量

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

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

enum SelectedTool
{
  None=0,
  Pencil,
  Pen,
  Eraser
}
我正在试图找出使用ReactiveObject设置此VM的最佳方法。我认为SelectedTool状态变量应该是只读的,并在工具选择时设置(这应该是ObservablesPropertyHelper吗?)。我还希望枚举的初始状态为“无”。我也不确定每个按钮是否应该有一个bool ReactiveProperty来支持。如果这些bool备份存在,那么我将不得不在VM中保持状态一致,随着更多工具的添加,这可能会是一件痛苦的事情。我想知道是否有一种方法可以让我在布尔值上使用WhenAny来设置适当的状态

谢谢

我认为SelectedTool状态变量应该是只读的,并在工具选择时设置(这应该是ObservablesPropertyHelper吗?)

事实上,我会以另一种方式来解释这一点——作为枚举的SelectedTool应该是真相的来源™, 让按钮状态反映了这一点

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
使其功能全面,但您不会从中获得太多好处。

我正在接近理解,但除非我缺少一些东西,否则此代码将阻止我松开铅笔。不切换任何工具是可行的(但我不想要清除状态的“无”按钮)。我还缺少视图绑定部分。我的xaml绑定到什么?或者你是在建议绑定应该连接到后面的代码中?我不确定此代码是否允许以下操作:如果铅笔被切换,然后单击笔,则铅笔应取消切换,笔应被选中。感谢代码背后,你会使用WhenAny+BindTo,与
pencilToggled
行“我正在接近理解,但除非我遗漏了一些东西,否则此代码将阻止我取消铅笔切换。”非常类似。我唯一清楚的是,可以为Create执行。如果我让它只能在未切换时切换,那么它将阻止我取消切换。我错过什么了吗?如果我把那部分拿出来,我会得到我预期的行为。是的,你现在应该把那部分拿出来