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

时间:2018-02-07 05:55:46

标签: c# wpf xaml mvvm

我想我可能在这里做了一些完全错误的事情,所以希望你们能纠正我。

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

FirstView.xaml.cs:

private readonly FirstViewModel viewModel = new FirstViewModel();

public AirplanesStatusView()
{
    InitializeComponent();
    DataContext = viewModel; //Bound to this viewModel for other reasons
}

FirstView.xaml:

<UserControl>
    <Grid>
        <Button Command="{Binding GotoSecondViewCommand}}" //This Command is in other MainWindowViewModel
    </Grid>
</UserControl>

MainWindow.xaml.cs:

private readonly MainWindowViewModel mainWindowViewModel = new MainWindowViewModel();

public MainWindow()
{
    InitializeComponent();
    DataContext = mainWindowViewModel;
}

那么从我在谷歌上发现的情况来看,这就是它接近切换视图的方式: 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>

MainWindowViewModel.cs:

private ICommand _gotoFirstViewCommand;
private ICommand _gotoSecondViewCommand;
private object _currentView;

public ICommand GotoFirstViewCommand{ //stuff }
public ICommand GotoSecondViewCommand{ //stuff }

public object CurrentView
{
    get { return _currentView; }
    set
    {
        _currentView = value;
        OnPropertyChanged("CurrentView");
    }
}

问题是当我运行程序时,在输出中它显示“System.Windows.Data Error:40:BindingExpression path error:'GotoSecondViewCommand'属性找不到'object'''FirstViewModel',所以Button可以甚至找不到命令。我很确定我做的事情完全错了,因为我对WPF和MVVM模式都很陌生。非常感谢帮助和纠正。

2 个答案:

答案 0 :(得分:0)

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

  1. 使用FirstViewModel中的按钮命令移动到SecondView。
  2. 使用SecoondViewModel中的Button命令移动到FirstView。
  3. 从MainViewModel删除命令,因为它没用。
  4. 将相关业务逻辑放在命令执行中以传输视图。
  5. 您的CurrentView只是当前用户控件(FirstView / Second View)
  6. 另一种方法是如果你想在MainViewModel中接受命令

    1. 只选择一个ICommand作为“ChangeViewsCommand”
    2. 从CurrentView
    3. 检测当前查看FirstView / Second View)
    4. 转移到另一个未激活的视图。

答案 1 :(得分:0)

试试这个:

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

它绑定到父窗口的DataContext,即定义MainWindowViewModel的{​​{1}}。