我在基于导航的 WPF 应用程序中遇到了类似的设计问题。我的解决方案是在 ViewModel 上定义 Action 命令,在 View 上定义 Navigation 命令,或者将全局 Navigations 定义为承载所有内容的 NavigationWindow 上的命令。
在某些情况下,例如交互导致操作和导航,我有我的视图级别命令调用我的 ViewModel 命令,然后导航以完成操作。
我不确定我对这种方法是否完全满意,虽然它成功地实现了我的目标,但它只是感觉不对。如果您找到更好的解决方案,我会非常感兴趣
导致导航的示例按钮
<Button Style="{StaticResource HyperLinkButtonStyle}"
Command="{Binding GoCurrentCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=View:MainWindow, AncestorLevel=1}}"
Content="Details"/>
带动作的普通按钮
<Button
Style="{StaticResource HyperLinkButtonStyle}"
Command="{Binding CompleteCommand}"
Content="Complete"/>
下面是一个示例视图级别命令,其中委托给 ViewModel(注意使用 ReactiveUI,因此语法可能与您习惯的不太一样)
public class MainWindow : NavigationWindow
{
...
//This defines when the command can be run
this._completeCommand = new ReactiveCommand(((SolutionViewModel)DataContext).CompleteCommand.CanExecuteObservable);
//This defines what to do when the command is run
this._completeCommand.Subscribe(
_ =>
{
((SolutionViewModel)DataContext).CompleteCommand.Execute(null);
this.NavigationService.Navigate(new IntentionsListPage { DataContext = this.DataContext });
});