0

ビューモデルのプロパティ Sessions にバインドされている GridView があります。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

Navigation ベースの WPF アプリケーションでも同様の設計上の問題がありました。私の解決策は、ViewModel で Action コマンドを定義し、View で Navigation コマンドを定義するか、すべてをホストする NavigationWindow でグローバル ナビゲーションをコマンドとして定義することでした。

インタラクションがアクションとナビゲーションの両方をもたらす場合など、場合によっては、View レベルのコマンドで ViewModel コマンドを呼び出してから、Navigating でアクションを完了させます。

この方法に完全に満足しているかどうかはわかりませんが、目標の達成には成功していますが、間違っていると感じています. あなたがより良い解決策を見つけたら、私は非常に興味があります

ナビゲーションにつながるボタンの例

<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 に答える