好的,我在这里有一个稍微复杂的功能。我想知道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>
答案 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}" />