1

我对 Windows 8 开发完全陌生,现在我遇到了使用 MVVM Light 混合触摸和键盘导航的问题。

因此,我在网格视图中有一个视图模型列表,只要选择其中一个,就会激活到所选视图模型的导航。这对触摸或鼠标完全有效,但使用键盘可能会变得非常混乱。实际上,自然的行为是使用箭头导航列表并在我想显示项目时按 Enter 键,但在这里,只需使用箭头键更改项目就会激活导航,这确实让用户感到困惑。

那么我该怎么做才能通过触摸和鼠标以及选择和键盘输入键的组合来激活导航呢?

这是我使用的代码。

视图模型:

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

我最终找到的最好方法是使用一些代码。但是我没有直接从 UI 导航,而是在视图模型中保留了导航逻辑。

所以我简单地连接了来自 GridView 的 ItemClick 事件,并在事件处理程序中将 Page 数据上下文转换为我的视图模型,然后我简单地从视图模型执行命令。这不容易维护,但它确实保留了 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 回答
0

在我看来,使用 MVVM 模式进行编码并不意味着所有与代码相关的事情都应该在模型中完成。与 UI 行为相关的操作(如导航)仍应通过使用控件中的可用事件在视图(代码隐藏)中完成。就像 GridView 的事件鼠标和键盘事件一样。

很多人可能不同意我的观点,但是在 WPF 和 Silverlight 中使用 MVVM 模式工作了几年之后,我必须说 UI 行为(视图)和控件的逻辑/功能性(模型)之间的良好组合,您还将被迫将一些仅与 UI 相关的内容放到代码隐藏中。至少,这是我的看法。

您可以做的是创建一个继承 GridView 的类(我们称之为 MyDataGrid)。然后,您可以使用 OnKeyDown 覆盖并在按 Enter 时让导航变为垂直状态。实际上,您可以使 MyDataGrid 的外观和行为“开箱即用”,就像您想要的那样,因此如果您想在您的应用程序(或另一个应用程序)的另一个地方使用相同的网格行为,则无需额外的代码。

于 2012-12-15T19:38:55.260 回答