就个人而言,我会使用 MVVM 设计模式做这样的事情
将ComboBox
绑定到ViewModel
或Model
对象的集合
所以你会有
<ComboBox ItemsSource="{Binding SomeCollection}"
SelectedItem="{Binding SelectedViewModel}"
DisplayMemberPath="DisplayName" />
whereSomeCollection
是object
您的ViewModel
, 的集合,SelectedViewModel
是object
保存所选项目的属性
SomeCollection = new ObservableCollection<object>();
SomeCollection.Add(new ViewModelA());
SomeCollection.Add(new ViewModelB());
SomeCollection.Add(new ViewModelC());
SomeCollection.Add(new ViewModelD());
SomeCollection.Add(new ViewModelE());
SelectedViewModel = SomeCollection[0];
现在您SaveCommand
可以访问通过使用选择的任何内容SelectedViewModel
并将其转换为基于typeof(SelectedViewModel
)的适当类型
就个人而言,我会使用通用接口IViewModel
而不是object
,并让它包含一些通用属性(例如DisplayName
)和方法。根据您的功能,您甚至可以让它包含它自己的保存逻辑,因此您可以在保存命令中执行它:
SelectedViewModel.Save();
至于显示正确的 View/UserControl,我会使用ContentControl
,Content
绑定到你的SelectedViewModel
, 并使用隐式数据模板告诉 WPF 如何绘制每个对象
<ContentControl Content="{Binding SelectedViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type local:ViewModelA}">
<local:UserControlA />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModelB}">
<local:UserControlB />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModelC}">
<local:UserControlC />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModelD}">
<local:UserControlD />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModelE}">
<local:UserControlE />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>