2014-07-15 19 views
0

我有一个使用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 
_________________________________________________________________________ 

上面可以看到我的应用程序的布局!正如你可以看到一切都在PRISM外壳容器内。我正在处理usercontrol工具栏后面代码中用户控件工具栏中的事件,如上所示。我想要的是当单击工具栏时替换细节窗格。但我不知道该怎么做?

+1

我会用一个消息系统(PRISM的'EventAggregator')以广播ChangeContentView消息,并有我的ViewModel订阅接收该类型的消息并更改“内容”窗格中显示的项目。如果你有兴趣,我甚至可以为PRISM的'EventAggregator'编写一个帮手包装器,它可以简化它在广播和订阅邮件时的使用方式[在我的博客上](http://rachel53461.wordpress.com/2011/10/09/ simplations-prisms-eventaggregator /) – Rachel

+0

谢谢@Rachel,但看起来非常复杂。我想要的是以某种方式用新窗口替换细节窗格。有没有其他方法? –

+0

假设您的详细信息窗格使用“ContentControl”显示,您可以将ContentControl.Content设置为您尝试显示的任何UserControl。如果需要,我在这种导航风格的另一个答案[这里](http://stackoverflow.com/a/12216068/302677)中有一个例子。也不要害怕PRISM的'EventAggregator'。这实际上并不那么复杂,尤其是使用该辅助包装器,如果你使用MVVM模式,它会让你的生活变得更容易:) – Rachel

回答

0

回头看看我的答案previous question。然后,您可以通过将DataEntryContext切换到不同DataEntryViewModel的新实例并使用DataTemplate来处理Toolbar事件,而您的Details面板中的UserControl将会更改以反映该情况。

在的MainView:

<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>  

在MainViewModel:

private void ToolbarContext_LoadFirstDetailExecuted(object sender, EventArgs e) 
{ 
    DataEntryContext = new FirstDetailViewModel(); 
} 

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