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

时间:2014-08-22 01:51:10

标签: wpf xaml wpf-controls mvvm-light contentpresenter

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

我有一个带有ListView项目的主窗口。如果我单击其中一个,则此窗口中的右侧Grid Column应填充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>

AdminDriver.cs(VM)

//Contains variables, and is the datacontext for the above usercontrol

AdminMain.xaml(查看所有管理员资料)

//Contains a bunch of junk for the min admin screen which has the listview with the options in it.  If you require this piece of code, I can trim it down but I don't se currently see it's relevance.  The DataGrid belongs in this window, I'm assuming in a Content Presenter.  Here is the ListView that is in column 1 of 2.

 <ListView ItemsSource="{Binding AdminMenu}"
                          Name="AdminFields"
                          SelectionMode="Single">
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="SelectionChanged">
                            <cmd:EventToCommand CommandParameter="{Binding SelectedItem, ElementName=AdminFields}" Command="{Binding registerSelected}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    <ListView.ItemTemplate>
                        <ItemContainerTemplate>
                            <TextBlock Text="{Binding FieldName}"/>
                        </ItemContainerTemplate>
                    </ListView.ItemTemplate>
                </ListView>

1 个答案:

答案 0 :(得分:1)

我会将DataContext绑定到UserControl之外。如果您有需要,这将允许您在其他地方使用它。相反,只需将DataContext绑定到您正在使用它的位置。

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

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

您可以在窗口顶部设置一些DataTemplates,它们将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添加到Grid并将其DataContext绑定到AdminDriver属性。将显示与DataTemplates中映射的所选项目的实际类型匹配的UserControl。

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