WPF MVVM Light动态视图和数据网格

WPF MVVM Light动态视图和数据网格,wpf,xaml,wpf-controls,mvvm-light,contentpresenter,Wpf,Xaml,Wpf Controls,Mvvm Light,Contentpresenter,好的,我这里有一个稍微复杂的功能。我想知道我是否做得很好。如果没有,我应该改变什么?2) 如果是适当的,我的问题的最佳解决方案是什么 我有一个带有项目列表视图的主窗口。如果单击其中一个,此窗口中的右侧网格列将填充带有所选项目信息的DataGrid。如果我单击ListView中的另一项,它将更改为另一个DataGrid 我已经看到了一些ContentPresenter示例,但我无法实现这一点,因此我将其剥离出来,并将向您展示到目前为止的代码。现在,我只有一个项目设置,所以我将继续使用这个驱动程序示

好的,我这里有一个稍微复杂的功能。我想知道我是否做得很好。如果没有,我应该改变什么?2) 如果是适当的,我的问题的最佳解决方案是什么

我有一个带有项目列表视图的主窗口。如果单击其中一个,此窗口中的右侧网格列将填充带有所选项目信息的DataGrid。如果我单击ListView中的另一项,它将更改为另一个DataGrid

我已经看到了一些ContentPresenter示例,但我无法实现这一点,因此我将其剥离出来,并将向您展示到目前为止的代码。现在,我只有一个项目设置,所以我将继续使用这个驱动程序示例

DriverGrid.xaml

 <UserControl DataContext="{Binding AdminDriver, Source={StaticResource Locator}}">
     <Grid>

          <DataGrid>
               //stuff here for datagrid
          </DataGrid>

          <Button Content="Edit" Command="{Binding ShowEditWindow}" />
          <Button Content="Add"  Command="{Binding ShowAddWindow}"/>
     </Grid>
 </UserControl>
AdminMain.xaml(查看所有管理员资料)

//包含一堆关于min admin屏幕的垃圾,该屏幕具有包含选项的listview。如果您需要这段代码,我可以删减它,但我目前看不出它的相关性。DataGrid属于这个窗口,我假设是在一个内容演示器中。下面是第1列(共2列)中的ListView。

我会将DataContext的绑定从UserControl中移除。这将允许你在其他地方使用它,如果你有需要的话。相反,只需将DataContext绑定到使用它的位置

<view:YourUserControl DataContext="{Binding AdminDriver}" />

如果您希望根据在ListView中选择的项目呈现不同的UserControl,那么您将使用ContentPresenter。ItemsSource中的所有项都将具有相同的基类或实现相同的接口,以便您可以将它们放在相同的ObservableCollection中。我假设AdminDriver也属于这种类型/接口

您可以在窗口顶部设置一些数据模板,将ItemsSource(AdminMenu)中可能的真实对象类型映射到表示它们的UserControl

<Window.Resource>
   <DataTemplate DataType="{x:Type model:TypeA}">
      <view:UserControlA />
   </DataTemplate>

   <DataTemplate DataType="{x:Type model:TypeB}">
      <view:UserControlB />
   </DataTemplate>
   //rinse and repeat
</Window.Resource>

//冲洗并重复
然后将ContentPresenter添加到网格中,并将其DataContext绑定到AdminDriver属性。将显示与DataTemplates中映射的选定项的实际类型相匹配的UserControl

<ContentPresenter Content="{Binding AdminDriver}" />


你能解释一下型号:给我打一个零件吗?我读过你的一句话“ItemsSource中的所有项都将具有相同的基类或实现相同的接口,以便可以将它们放在相同的ObservableCollection中。”OC不是相同的数据类型。集合没有“一个”基类。另外,每个菜单项还将有一个DataGrid/UserControl。相信我,我已经尝试过使用一个,但这不是我们设计团队要求的选项。它需要被分解。那么AdminMenu集合是ObservableCollection?您是在告诉我registerSelected命令根据在ListView中选择的项目设置不同的属性吗?是:this.registerSelected=new RelayCommand((selectedMenuItem)=>{this.selectedMenuItem=selectedMenuItem.FieldName;});因此,在我们的小示例中,this.SelectedMenuItem=“Driver”必须显示更多代码。把它加到问题上。这是您所做工作的关键组成部分。我想看看AdminMenu中的项看起来像什么样的类,其中设置了AdminDriver,SelectedMenuItem=SelectedMenuItem.FieldName对您有什么作用?例如…为什么不将SelectedItem绑定到SelectedMenuItem?当然,给我5。除非你想搬到聊天室?
<Window.Resource>
   <DataTemplate DataType="{x:Type model:TypeA}">
      <view:UserControlA />
   </DataTemplate>

   <DataTemplate DataType="{x:Type model:TypeB}">
      <view:UserControlB />
   </DataTemplate>
   //rinse and repeat
</Window.Resource>
<ContentPresenter Content="{Binding AdminDriver}" />