我正在学习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的实例。这可能是个问题?
答案 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}}}"
我现在没有代码编辑器,但希望它有所帮助。