我目前有一个看起来像这样的视图模型:
public class PhrasesFrameViewModel : ObservableProperty
{
bool customPointsSwitch;
public PhrasesFrameViewModel()
{
var aButtonClickedCommand = new Command(() =>
{
App.DB.IncrementScore(App.cfs, App.phrase, (int)App.aBtn);
App.correctButtonPressed = (int)App.aBtn;
ResetTimer2();
});
var wordGridClickedCommand = new Command(() =>
{
if (App.Timer1Running)
ResetTimer1();
else
ResetTimer2();
});
}
private static void ResetTimer1()
{
if (App.tokenSource1 != null)
{
App.Timer1Seconds = 0;
App.tokenSource1.Cancel();
}
}
private static void ResetTimer2()
{
if (App.tokenSource2 != null)
{
App.Timer2Seconds = 0;
App.tokenSource2.Cancel();
}
}
public bool CustomPointsSwitch
{
get
{
return customPointsSwitch;
}
set
{
if (value != customPointsSwitch)
{
customPointsSwitch = value;
NotifyPropertyChanged("CustomPointsSwitch");
App.DB.UpdateBoolSetting(Settings.Cp, customPointsSwitch);
}
}
}
我相信大多数视图模型都会有类似于CustomPointsSwitch的代码,但是手势识别器和命令的代码加上小的重置方法(视图模型中的一些其他方法使用)如何。这些都属于视图模型还是属于另一个类?
答案 0 :(得分:1)
简答:在这种特殊情况下,根据相关代码共享,它们属于视图模型。
答案很长: 这取决于。如果你的命令处理程序需要与UI交互 - 它应该保持在视图中;如果它是其他任何东西,即表示或业务逻辑 - 它应该在视图模型中定义。
命令是MVVM模式的组成部分 - 因为它们允许视图模型与视图分离,这反过来使单元测试,维护和扩展更容易。它们是视图和视图模型之间通信的推荐通道(数据绑定除外)。
在大多数情况下,当视图中的用户交互/事件需要触发视图模型中的各种操作时,使用命令界面 - 在这些情况下,命令在视图模型本身中定义并公开为属性。