Ern*_*ren 1 c# wpf inheritance user-controls listbox
我有多个 UserControls,我想在 ListBox 上显示它们假设我有一个 Employee 抽象 UserControl 并且我有 2 个或更多的 UserControls,而不是使用该员工,例如 AdministrativeEmployee 和 FactoryEmployee 为每个员工我有不同的数据,但 UserControl 非常类似(相同的大小,几乎相同的字段),在 ViewModel 端我有一个抽象的 EmployeeViewModel、AdministrativeEmployeeViewModel 和 FatoryEmployeeViewModel,在EmployeesView 上我有一个带有数据绑定的ListBox,在EmployeesViewModel 上我有一个ICollection Employees
员工视图.xaml:
xmlns:local="clr-namespace:Solution.Controls"
Run Code Online (Sandbox Code Playgroud)
——
<ListBox ItemsSource={Binding Employees}>
<ListBox.ItemTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding}" Name="Presenter" />
<DataTemplate.Triggers>
<DataTrigger Value="{x:Type local:AdministrativeEmployeeView}">
<Setter TargetName="Presenter" Property="Content">
<Setter.Value>
<local:AdministrativeEmployeeView />
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Value="{x:Type local:FactoryEmployeeView}">
<Setter TargetName="Presenter" Property="Content">
<Setter.Value>
<local:FactoryEmployeeView/>
</Setter.Value>
</Setter>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
员工视图模型.cs:
public ICollection<EmployeeViewModel> Employees { get; set; }
Run Code Online (Sandbox Code Playgroud)
但这显示了 ListBox 上的 System.ItemTemplate 而不是每种员工类型的 UserControls
在ListBox资源中定义两个数据模板:
<ListBox ItemsSource="{Binding Employees}">
<ListBox.Resources>
<DataTemplate DataType="{x:Type local:AdministrativeEmployee}">
<local:AdministrativeEmployeeView />
</DataTemplate>
<DataTemplate DataType="{x:Type local:FactoryEmployee}">
<local:FactoryEmployeeView />
</DataTemplate>
</ListBox.Resources>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
模型类:
public class Employee
{
public string Name { get; set; }
}
public class AdministrativeEmployee : Employee
{
}
public class FactoryEmployee : Employee
{
}
Run Code Online (Sandbox Code Playgroud)
样本数据:
List<Employee> _source = new List<Employee>();
_source.Add(new AdministrativeEmployee { Name = "A test1" });
_source.Add(new FactoryEmployee { Name = "F test1" });
_source.Add(new AdministrativeEmployee { Name = "A test2" });
_source.Add(new FactoryEmployee { Name = "F test2" });
Employees = _source;
Run Code Online (Sandbox Code Playgroud)
行政员工视图:
<UserControl ...>
<Grid>
<TextBlock Text="{Binding Name}" Background="Red" />
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
工厂员工视图:
<UserControl ...>
<Grid>
<TextBlock Text="{Binding Name}" Background="Green" />
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
结果:
