0

我有一个 GridView,它绑定到我的视图模型上的属性 Sessions。在 GridView 中选择新项目时,我希望它触发导航到新视图。Sessions 属性是 SessionViewModel 的列表,但它有几个具有独立对应视图的子类。我目前在我的视图代码后面有这个:

this.BindCommand(ViewModel, x => x.SessionNavigateCommand, x => x.SessionsGridView, "ItemClick");

这会返回到我的视图模型上的 SessionNavigateCommand,这是 IReactiveCommand 类型。我想像这样订阅命令:

SessionNavigateCommand.Subscribe(x => HostScreen.Router.Navigate.Execute(x));

但是事件参数包装了我需要的实际视图模型,我不想用视图特定的代码污染我的视图模型。

4

1 回答 1

0

我在基于导航的 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 });
    });
于 2013-07-03T06:39:45.293 回答