我有一个示例 MVVM WPF 应用程序,但在为我的动态加载模型创建 DataTemplates 时遇到问题。让我试着解释一下:
我有以下简化的类作为我的模型的一部分,我正在动态加载
public class Relationship
{
public string Category { get; set; }
public ParticipantsType Participants { get; set; }
}
public class ParticipantsType
{
public ObservableCollection<ParticipantType> Participant { get; set; }
}
public class ParticipantType
{
}
public class EmployeeParticipant : ParticipantType
{
public EmployeeIdentityType Employee { get; set; }
}
public class DepartmentParticipant : ParticipantType
{
public DepartmentIdentityType Department { get; set; }
}
public class EmployeeIdentityType
{
public string ID { get; set; }
}
public class DepartmentIdentityType
{
public string ID { get; set; }
}
这是我的视图模型的样子。我创建了一个通用对象Model
属性来公开我的模型:
public class MainViewModel : ViewModelBase<MainViewModel>
{
public MainViewModel()
{
SetMockModel();
}
private void SetMockModel()
{
Relationship rel = new Relationship();
rel.Category = "213";
EmployeeParticipant emp = new EmployeeParticipant();
emp.Employee = new EmployeeIdentityType();
emp.Employee.ID = "222";
DepartmentParticipant dep = new DepartmentParticipant();
dep.Department = new DepartmentIdentityType();
dep.Department.ID = "444";
rel.Participants = new ParticipantsType() { Participant = new ObservableCollection<ParticipantType>() };
rel.Participants.Participant.Add(emp);
rel.Participants.Participant.Add(dep);
Model = rel;
}
private object _Model;
public object Model
{
get { return _Model; }
set
{
_Model = value;
NotifyPropertyChanged(m => m.Model);
}
}
}
然后我尝试创建一个 ListBox 来专门显示参与者集合:
<ListBox ItemsSource="{Binding Path=Model.Participants.Participant}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Expander Header="IdentityFields">
<!-- WHAT TO PUT HERE IF PARTICIPANTS HAVE DIFFERENT PROPERTY NAMES -->
</Expander>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
问题是:
- 我不知道如何创建一个可以处理这两种类型的 ParticipantTypes 的模板,在这种情况下,我可以有 EmployeeParticipant 或 DepartmentParticipant,因此根据这一点,数据绑定路径将被设置为
Employee
或Department
相应的属性 - 我想为每种类型创建一个 DataTemplate(例如 x:Type EmployeeParticipant),但问题是我的模型中的类是在运行时动态加载的,所以 VisualStudio 会抱怨这些类型在当前解决方案中不存在。
如果我的具体类型在编译时不知道,但仅在运行时不知道,我怎么能在 ListBox 中表示这些数据?
编辑:添加了我的测试 ViewModel 类