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