Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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# 将按钮命令绑定到不同的ViewModel_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 将按钮命令绑定到不同的ViewModel

C# 将按钮命令绑定到不同的ViewModel,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我想我可能做错了什么,希望你们能纠正我 我想使用一个按钮切换视图(在窗口内切换UserControls),然后让另一个视图能够有一个按钮切换回第一个视图(如后退按钮)。我已经找到了如何使用Google来实现这一点,但我遇到的问题是,我将第一个视图的DataContext绑定到一个ViewModel,而切换视图的代码则在另一个ViewModel中,因此我似乎无法绑定第一个视图中的按钮以将其命令绑定到另一个ViewModel。以下是我的意思(简化): FirstView.xaml.cs: priva

我想我可能做错了什么,希望你们能纠正我

我想使用一个按钮切换视图(在窗口内切换UserControls),然后让另一个视图能够有一个按钮切换回第一个视图(如后退按钮)。我已经找到了如何使用Google来实现这一点,但我遇到的问题是,我将第一个视图的DataContext绑定到一个ViewModel,而切换视图的代码则在另一个ViewModel中,因此我似乎无法绑定第一个视图中的按钮以将其命令绑定到另一个ViewModel。以下是我的意思(简化):

FirstView.xaml.cs:

private readonly FirstViewModel viewModel = new FirstViewModel();

public AirplanesStatusView()
{
    InitializeComponent();
    DataContext = viewModel; //Bound to this viewModel for other reasons
}
private readonly MainWindowViewModel mainWindowViewModel = new MainWindowViewModel();

public MainWindow()
{
    InitializeComponent();
    DataContext = mainWindowViewModel;
}
FirstView.xaml:

<UserControl>
    <Grid>
        <Button Command="{Binding GotoSecondViewCommand}}" //This Command is in other MainWindowViewModel
    </Grid>
</UserControl>
那么从我在谷歌上发现的情况来看,这就是如何进行视图切换: MainWindow.xaml:

<Window>
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:FirstViewModel}">
            <local:FirstView/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:SecondViewModel}">
            <local:SecondView/>
        </DataTemplate>
    </Window.Resources>

    <ContentControl Content="{Binding CurrentView}" />
</Window>

问题是当我运行程序时,它的输出显示System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“FirstViewModel”上找不到“GotoSecondViewCommand”属性,因此按钮甚至找不到该命令。我很确定我做了一些完全错误的事情,因为我对WPF和MVVM模式还很陌生。非常感谢您的帮助和纠正。

您将错误的ViewModel绑定为DataContext。根据你的结构,你需要做

  • 在FirstViewModel中获取用于移动到SecondView的按钮的命令
  • 在SecoondViewModel中获取用于移动到FirstView的按钮的命令
  • 从MainViewModel中删除命令,因为它没有任何用处
  • 将相关业务逻辑放入命令执行中以传输视图
  • 您的CurrentView只不过是当前用户控件(FirstView/Second View)
  • 另一种方法是,如果要在MainViewModel中执行命令

  • 仅将一个ICommand作为“ChangeViewsCommand”
  • 从CurrentView(第一视图/第二视图)检测当前视图
  • 转移到另一个未激活的视图
  • 试试这个:

    <Button Command="{Binding DataContext.GotoSecondViewCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>
    
    
    

    它绑定到父窗口的
    DataContext
    ,即定义了
    GotoSecondViewCommand
    MainWindowViewModel

    必须在viewmodel中使用按钮命令,该命令与用户控件绑定,而不是绑定到主窗口。
    private readonly FirstViewModel
    。。。为什么这在您的视图中,而不在您的
    MainWindowVM
    中?这就是你使事情变得比实际更复杂的方式。对于按钮中的绑定,你必须使用
    RelativeSource
    将其绑定到父级。因此,这对于第一个视图的按钮非常有效。它调用MainWindowViewModel中的GotoSecondViewCommand,就像我想要的一样,但它不适用于第二个视图的“后退”按钮。我希望此“后退”按钮在MainWindowViewModel中调用GoToFirstViewCommand。在SecondViiew.xaml中,我完全按照您所说的做了(只是将绑定更改为GoToFirstViewCommand),但我遇到了以下错误:无法找到引用为“RelativeSource FindAncestor,AncestorType='System.Windows.Window',AncestorLevel='1'的绑定源。BindingExpression:Path=DataContext.GotoFirstViewCommand;DataItem=null;目标元素是“Button”(Name='ButtonBack');目标属性为“Command”(类型为“ICommand”)
    <Button Command="{Binding DataContext.GotoSecondViewCommand, RelativeSource={RelativeSource AncestorType=Window}}"/>