从第一个用户控件wpf MVVM打开第二个用户控件

时间:2019-03-01 15:06:19

标签: c# wpf mvvm

我有一个带有MVVM模式的WPF应用程序。我有一个带有几个标签的主窗口。在主窗口中单击不同的按钮时,将显示其用户控件。我的工作很好。但是,我需要在用户控件之一中单击按钮时打开用户控件。不是从主窗口。我该怎么做呢? 这是我到目前为止的内容:

MainWindow.XAML:我正在为每个用户控件创建数据模板

<DataTemplate DataType="{x:Type homeViewModel:HomeWindowViewModel}">
    <homeViewModel:HomeWindow></homeViewModel:HomeWindow>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:PauseViewModel}">
    <viewModel:Pause></viewModel:Pause>
</DataTemplate>
<DataTemplate DataType="{x:Type logoffVM:LogOffViewModel}">
    <logoffVM:LogOff></logoffVM:LogOff>
</DataTemplate>
<DataTemplate DataType="{x:Type viewModel:ReportViewModel}">
    <viewModel:Report></viewModel:Report>
</DataTemplate>

并在ItemsControl内部显示用户控件:

<Grid x:Name="UserControlGrid"  Width="Auto" Height="auto" Margin="100,40,0,0">
    <ItemsControl ItemsSource="{Binding ViewsToShow}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Grid IsItemsHost="True" Width="auto" Height="auto"></Grid>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Grid>

我在MainWindow ViewModel类中将按钮绑定到Command。

在MainWindowViewModel中:

public ObservableCollection<ObservableObject> ViewsToShow
{
    get
    {
        return viewsToShow;
    }
    set
    {
        viewsToShow = value;
        OnPropertyChanged("ViewsToShow");
    }
}

命令:

public ICommand GetNextCommand
{
    get { return new RelayCommand(() => GetNext()); }
}

public ICommand GetOrderCommand
{
    get { return new RelayCommand(() => GetOrder()); }
}

以及加载用户控件的方法:

public void GetNext()
{
    Order orders = new Order();
    ViewsToShow.Clear();
    ViewsToShow.Add(new OrderDisplayViewModel("GetNext", orders, new WindowFactory()));
}

public void GetOrder()
{
    ViewsToShow.Clear();
    ViewsToShow.Add(new GetOrderViewModel());
}

所有这些在MainWindow中都可以正常工作。但是,如何从GetNext用户控件中打开GetOrder用户控件?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用DataContextUserControl绑定到父窗口的RelativeSource的属性;

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