如何绑定命令以在页面之间导航?

时间:2015-10-19 13:18:45

标签: c# wpf mvvm

我正在学习MVVM导航,如下所示:

Navigation with MVVM

在本教程中,绑定按钮控件的命令是通过使用 ItemsControl 实现的,如下所示:

java.lang.IllegalArgumentException: wrong number of arguments
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at ExcecutionEngine.DriverScript.execute_Actions(DriverScript.java:81)
    at ExcecutionEngine.DriverScript.main(DriverScript.java:65)

如果我理解正确,它会遍历PageViewModels的集合,并为每个VIewModel绑定一个按钮命令。这个例子工作正常,我可以在没有问题的页面之间切换。

但是,我不想迭代地创建按钮。我想在网格中有两个按钮,使用相同的命令切换视图,如上例所示。像这样:

<Window.Resources>
    <DataTemplate DataType="{x:Type local:HomeViewModel}">
        <local:HomeView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:ProductsViewModel}">
        <local:ProductsView />
    </DataTemplate>
</Window.Resources>

<DockPanel>
    <Border DockPanel.Dock="Left" BorderBrush="Black" BorderThickness="0,0,1,0">
        <ItemsControl ItemsSource="{Binding PageViewModels}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button Content="{Binding Name}"
                            Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                            CommandParameter="{Binding }"
                            Margin="2,5"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Border>

    <ContentControl Content="{Binding CurrentPageViewModel}" />
</DockPanel>

但这并不像我预期的那样奏效。我能够绑定View的名称,但不能绑定Command。单击按钮无效。 DataContext设置为我的ApplicationViewModel的实例。这可能是个问题?

1 个答案:

答案 0 :(得分:0)

问题出在CommandParameter="{Binding }",在第一个示例中,绑定指向ItemsSource="{Binding PageViewModels}"。第二个示例没有该部分,因此绑定失败。

<强>编辑&gt;&GT;&GT;&GT;

为了澄清,您必须将command参数绑定到datacontext中的instanciated viewModel。

视图模型:

public IPageViewModel homeViewModel{get; set;}
public IPageViewModel productsViewModel{get; set;}

...

IPageViewModel homeViewModel = new HomeViewModel();
IPageViewModel productsViewModel = new ProductsViewModel();

查看:

CommandParameter="{Binding DataContext.homeViewModel, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"

我现在没有代码编辑器,但希望它有所帮助。