Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何绑定命令在页面之间导航?_C#_Wpf_Mvvm - Fatal编程技术网

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

C# 如何绑定命令在页面之间导航?,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在学习使用MVVM进行导航,如下所示: 在本教程中,通过使用ItemsControl为按钮控件绑定命令,如下所示: <Window.Resources> <DataTemplate DataType="{x:Type local:HomeViewModel}"> <local:HomeView /> </DataTemplate> <DataTemplate DataType="{x:Type l

我正在学习使用MVVM进行导航,如下所示:

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

<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>
<Window.Resources>
    <DataTemplate DataType="{x:Type local:HomeViewModel}">
        <local:HomeView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:ProductsViewModel}">
        <local:ProductsView />
    </DataTemplate>
</Window.Resources>

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="5*"/>
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0"
        Content="{Binding HomeView.Name}"
        Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
        CommandParameter="{Binding }"/>

    <Button Grid.Column="1"
        Content="{Binding ProductsView.Name}"
        Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
        CommandParameter="{Binding }"/>
</Grid>

如果我理解正确,它将遍历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>
<Window.Resources>
    <DataTemplate DataType="{x:Type local:HomeViewModel}">
        <local:HomeView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:ProductsViewModel}">
        <local:ProductsView />
    </DataTemplate>
</Window.Resources>

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="5*"/>
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0"
        Content="{Binding HomeView.Name}"
        Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
        CommandParameter="{Binding }"/>

    <Button Grid.Column="1"
        Content="{Binding ProductsView.Name}"
        Command="{Binding DataContext.ChangePageCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
        CommandParameter="{Binding }"/>
</Grid>


但这并不像我预期的那样有效。我可以绑定视图的名称,但不能绑定命令。单击按钮没有任何作用。DataContext设置为我的ApplicationViewModel的实例。这里可能有什么问题?

问题在
命令参数=“{Binding}”
中,在第一个示例中,绑定指向
项资源=“{Binding PageViewModels}”
。第二个示例没有该部分,因此绑定失败

编辑>>>>>

为了澄清,必须将命令参数绑定到datacontext中的实例化viewModel

视图模型:

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

...

IPageViewModel homeViewModel = new HomeViewModel();
IPageViewModel productsViewModel = new ProductsViewModel();
视图:


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

您是否尝试过将命令绑定更改为
{Binding ChangePageCommand…
?是。该按钮现在已禁用,无法单击。否。这不是问题,是否确定?然后绑定指向何处?如果不确定,请尝试使用转换器调试绑定以查看值。