Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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 - Fatal编程技术网

C# 如何在调用工具栏项时替换详细信息视图?

C# 如何在调用工具栏项时替换详细信息视图?,c#,wpf,C#,Wpf,我有一个使用PRISM的WPF应用程序。该应用程序分为两个部分。左窗格是菜单窗格,右窗格是详细信息窗格。容器窗格中还有一个工具栏,它是一个用户控件 现在,我希望当我单击工具栏选项时,我应该能够用新的用户控件/窗口替换右窗格详细信息窗格。我该怎么做?目前,我在工具栏的编辑按钮点击中有以下代码,它会打开一个新窗口我不想要一个新窗口我想要替换右窗格窗口详细信息窗口 private void EditButtonClick(object sender, RoutedEventArgs e) {

我有一个使用PRISM的WPF应用程序。该应用程序分为两个部分。左窗格是菜单窗格,右窗格是详细信息窗格。容器窗格中还有一个工具栏,它是一个用户控件

现在,我希望当我单击工具栏选项时,我应该能够用新的用户控件/窗口替换右窗格详细信息窗格。我该怎么做?目前,我在工具栏的编辑按钮点击中有以下代码,它会打开一个新窗口我不想要一个新窗口我想要替换右窗格窗口详细信息窗口

private void EditButtonClick(object sender, RoutedEventArgs e)
{
    Window userEditWindow = new Window
    {
        Title = "User Edit",
        Content = new UserEdit(),
        Width = 600,
        Height = 600
    };

    userEditWindow.Show();
}
以下是用户界面的外观:

_______________________________________________________________________
PRISM shell container begins
________________________________________________________________________
                   | User control containing toolbar (edit, new, update, delete)
 menu user control |____________________________________________________
                   |details pane user control
                   |
                   |
__________________________________________________________________                  |_______________________________________________________________

PRISM shell container ends
_________________________________________________________________________

上面你可以看到我的应用程序的布局!正如您所看到的,所有内容都在棱柱壳容器中。如上图所示,我正在处理usercontrol工具栏代码中用户控件工具栏的事件。我只想在单击工具栏时替换详细信息窗格。但是我不知道怎么做?

回头看看我对你的问题的回答。然后,您可以通过将DataEntryContext切换到不同DataEntryViewModel的新实例,并使用DataTemplate来处理工具栏事件。详细信息窗格中的UserControl将更改以反映这一点

在主视图中:

<Window
   //usual window declarations>

   <Window.Resources>
      <DataTemplate DataType="{x:Type vm:FirstDetailViewModel}">
         <view:FirstDetailView />
      </DataTemplate>

      <DataTemplate DataType="{x:Type vm:SecondDetailViewModel}">
         <view:SecondDetailView />
      </DataTemplate>

      //more DataTemplates for other data entry views
   </Window.Resources>

   <Grid>
      <Grid.RowDefinitions>
         <RowDefinition Height="Auto" />
         <RowDefinition Height="Auto" />
      </Grid.RowDefinitions>

      <view:ToolbarView Grid.Row="0"
                        DataContext="{Binding ToolbarContext}" />
      <ContentPresenter Grid.Row="1"
                        Content="{Binding DataEntryContext}" />
   </Grid>
</Window>    

我将使用消息传递系统PRISM的EventAggregator来广播ChangeContentView消息,并让我的ViewModel订阅以接收此类消息并更改内容窗格中显示的项目。如果你感兴趣的话,我甚至为PRISM的EventAggregator编写了一个helper包装器,它简化了广播和订阅消息的方式。谢谢@Rachel,但这看起来非常复杂。我只想用一个新窗口替换详细信息窗格。还有其他方法吗?假设您的详细信息窗格使用ContentControl显示,您可以将ContentControl.Content设置为您尝试显示的任何UserControl。我有一个例子,在另一个答案这种风格的导航,如果你想。也不要害怕PRISM的EventAggregator。事实上,它并没有那么复杂,尤其是使用帮助器包装器,如果您使用MVVM模式,它会让您的生活变得更加轻松:
private void ToolbarContext_LoadFirstDetailExecuted(object sender, EventArgs e)
{
   DataEntryContext = new FirstDetailViewModel();
}

private void ToolbarContext_LoadSecondDetailExecuted(object sender, EventArgs e)
{
   DataEntryContext = new SecondDetailViewModel();
}