1

私はWindows8の開発にまったく慣れていませんが、MVVMLightを使用したタッチナビゲーションとキーボードナビゲーションの混合の問題に直面しています。

グリッドビューにビューモデルのリストがあり、そのうちの1つを選択すると、選択したビューモデルへのナビゲーションがアクティブになります。これは、タッチまたはマウスではまったく問題なく機能しますが、キーボードでは非常に混乱する可能性があります。確かに、自然な動作は、アイテムを表示したいときに矢印でリストをナビゲートし、Enterキーを押すことですが、代わりに、ここでは、ユーザーを本当に混乱させる矢印キーでアイテムを変更するだけでナビゲーションがアクティブになります。

では、タッチとマウスを使用した選択、および選択とキーボードによるEnterキーの組み合わせを使用して、ナビゲーションをアクティブにするにはどうすればよいでしょうか。

これが私が使用するコードです。

ViewModel:

public ReleaseViewModel SelectedRelease
{
    get
    {
        return selectedRelease;
    }
    set
    {
        if(selectRelease != value)
        {
            selectedRelease = value;
        }

        // Navigation code here
    }
}

意見:

<GridView
    ItemsSource="{Binding Releases}"
    ItemTemplate="{StaticResource ReleaseTemplate}"
    ItemContainerStyle="{StaticResource GridViewItemStyle}"
    Grid.ColumnSpan="2"
    Grid.Row="2"
    Padding="116,0,40,46"
    SelectedItem="{Binding SelectedRelease, Mode=TwoWay}"/>
4

2 に答える 2

0

私の意見では、MVVMパターンを使用してコーディングすることは、コード関連のすべてをモデルで実行する必要があることを意味するわけではありません。UIビヘイビアに関連する操作(ナビゲーションなど)は、コントロールから使用可能なイベントを使用して、ビュー(コードビハインド)で引き続き実行する必要があります。GridViewのイベントのようにマウスとキーボードのイベント。

多くの人が私に同意しないかもしれませんが、WPFとSilverlightの両方でMVVMパターンを数年間使用した後、UIの動作(ビュー)とコントロールのロジック/機能性(モデル)の適切な組み合わせを言わなければなりません。また、UIに関係するいくつかのものをコードビハインドにのみ配置する必要があります。少なくとも、これは私の意見です。

あなたができることは、GridViewを継承するクラスを作成することです(それをMyDataGridと呼びましょう)。次に、OnKeyDownオーバーライドを使用して、Enterキーを押したときにナビゲーションを垂直方向に移動させることができます。MyDataGridを実際に必要に応じて「すぐに使用できる」外観と動作にすることができるため、アプリ(または別のアプリ)の別の場所で同じグリッド動作を使用する場合に余分なコードはありません。

于 2012-12-15T19:38:55.260 に答える
0

私が最終的に見つけた最良の方法は、背後にあるコードを使用することです。ただし、UIから直接ナビゲートする代わりに、ビューモデルにナビゲーションロジックを保持しました。

そのため、GridViewからItemClickイベントを接続し、イベントハンドラーで、ページデータコンテキストをビューモデルにキャストしてから、ビューモデルからコマンドを実行しました。これは維持するのは簡単ではありませんが、MVVMの関心の分離を確実に維持します。

private void GridView_ItemClick(object sender, ItemClickEventArgs e)
{
    MyViewModel vm = (MyViewModel)this.DataContext;

    if(vm.NavigateToSelectionCommand.CanExecute(null))
    {
        vm.NavigateToSelectionCommand.Execute(e.ClickedItem);
    }
}

それでも、よりクリーンで保守しやすいソリューションが時間とともに出てくることを願っています。

于 2012-12-21T11:07:19.043 に答える