【发布时间】:2018-11-27 17:45:15
【问题描述】:
我已经看到了很多关于此的不同帖子,但我仍然对执行此操作的正确方法感到困惑。我正在实现 RelayCommand 和 IRequireViewID 来执行诸如调用 WindowsManager 类以从不需要知道它正在调用哪个窗口的视图中关闭窗口等操作。 但是,出现这样的情况是我不确定如何正确实施的地方。
所以基本上我在 viewModel 中有一个命令,您可以在其中单击一个按钮,一旦发生这种情况,我需要将数据保存到数据库中。我如何在视图中拥有命令,然后将其逻辑放入 ViewModel 中? IE,基本上 ViewModel 需要知道何时调用命令。我的意思是我总是可以在视图模型中放置一个静态方法并从视图中调用它,但我假设这可能不是实现它的好方法,即视图中的 MyViewModel.RedValidation。
RelayCommand 类
public class RelayCommand : ICommand
{
private Action commandTask;
public RelayCommand(Action commandToRun)
{
commandTask = commandToRun;
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
commandTask();
}
}
查看
public ICommand ValidateRed
{
get => new RelayCommand(RedValidation);
}
private void RedValidation()
{
//SAVE Data To DB <----This should be in the ViewModel though right?
}
XAML:
<Button Name="ValidateBtn" Style="{StaticResource mainButtons}" Content="Validate Email" Width="100"
HorizontalAlignment="Left" Command="{Binding ValidateRed}"/>
【问题讨论】:
-
在您的示例中,视图中唯一位于 UI 旁边的是触发器。这会触发您的视图模型上的命令。绑定将在调用时通知它。事实上,幸福是相反的。视图不知道命令或触发了什么。这就是关注点分离的意义所在。视图应该只关心展示,视图模型提供它需要的任何东西。
-
“将数据保存到数据库”绝对不应该出现在 View 或 ViewModel 中。它应该在数据访问层中
标签: c# wpf mvvm command viewmodel