我有一个简单的WPF应用程序,如下所示:
我还创建了3种不同的 View :
每个 View 都有自己的ViewModel
ParentView.xaml
...
<!-- Detail Area -->
<GroupBox x:Name="groupDetails" Grid.Column="0" Header="Details"
HorizontalAlignment="Stretch"
Grid.Row="0" VerticalAlignment="Stretch">
<GroupBox.Resources>
<ResourceDictionary>
<DataTemplate DataType="{x:Type vm:DetailType1ViewModel}">
<views:DetailType1View/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:DetailType2ViewModel}">
<views:DetailType2View/>
</DataTemplate>
</ResourceDictionary>
</GroupBox.Resources>
<ContentPresenter DataContext="{Binding}" Content="{Binding Path=BaseTypeViewModel}" />
</GroupBox>
...
ParentViewModel.cs
...
public BaseViewModel BaseTypeViewModel
{
get { return GetValue<BaseViewModel>(); }
set
{
SetValue(value);
}
}
private void ShowDetailDialog()
{
var vm = GetViewModelByID(SelectedID);
BaseTypeViewModel = vm;
}
private BaseViewModel GetViewModelByID(int Id)
{
switch (Id)
{
case 1:
return IoC.Get<DetailType1ViewModel>();
case 2:
return IoC.Get<DetailType2ViewModel>();
}
}
...
DetailType1ViewModel.cs
public class DetailType1ViewModel : BaseViewModel
{
...
}
我的问题是:
每次我在左 Pane 中双击DataGrid的行时,我都希望根据所选ID将上述 View 之一加载到“详细信息”区域中。那么可以使用哪些技术呢?如果您可以向我展示代码示例,那就太好了。
感谢所有人的帮助。
最佳答案
<DataTemplate>
)在<ResourceDictionary>
中创建一个DataType={x:Type local:DetailTypeViewModelX}
。 <ResourceDictionary>
合并到详细信息区域的祖先中。可能的位置是<Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="..." />
。 DataContext
绑定(bind)到要显示的ViewModel实例。 <ContentPresenter Content="{Binding}" />
内容的详细信息区域中创建<DataTemplate>
。这应该起作用并遵循MVVM的总体概念。
关于c# - WPF/MVVM在运行时动态加载 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39996682/