サンプルの 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
それに応じてプロパティが設定されます。 - 各タイプ (x:Type EmployeeParticipant など) の DataTemplate を作成することについてですが、問題は、モデル内のクラスが実行時に動的に読み込まれるため、VisualStudio が現在のソリューションにそれらのタイプが存在しないと不平を言うことです。
具体的な型がコンパイル時に不明で、実行時にしかわからない場合、このデータを ListBox で表現するにはどうすればよいでしょうか?
編集:私のテスト ViewModel クラスを追加しました