WPF 将多个 UserControl 绑定到一个列表框

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

kma*_*zek 5

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)

结果:

在此处输入图片说明