2013-10-17 157 views
0

我有多个用户控件,我想在列表框中显示它们 让我们假设我有一个Employee抽象用户控件,并且我有两个或多个用户控件,而不是像AdministrativeEmployee和FactoryEmployee这样的员工用于每个这些雇员我有不同的数据,但UserControl是非常相似的(相同的大小,几乎相同的领域),在ViewModel方面我有一个抽象的EmployeeViewModel,AdministrativeEmployeeViewModel和FatoryEmployeeViewModel,在EmployeesView我有ListBox与数据绑定和EmployeesViewModel我有一个ICollection员工WPF将多个用户控件绑定到列表框

EmployeesView.xaml:

xmlns:local="clr-namespace:Solution.Controls" 

-

<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> 

EmployeesViewModel.cs:

public ICollection<EmployeeViewModel> Employees { get; set; } 

但是,告诉我System.ItemTemplate在列表框,而不是为每种类型的员工

的用户控件
+0

这是一个错字? 'ItemsSource = {Binding Employees}'应该是'ItemsSource =“{Binding Employees}”'。没有绑定的DataTrigger是无用的。 – LPL

+2

看起来你在这里使用的是一个非常迂回的方法。为什么不直接用Type指定DataTemplates?这将自动呈现每个类型及其分配的模板。 – McGarnagle

回答

3

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> 

模型类:

public class Employee 
{ 
    public string Name { get; set; } 
} 

public class AdministrativeEmployee : Employee 
{ 
} 

public class FactoryEmployee : Employee 
{ 
} 

样本数据:

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; 

AdministrativeEmployeeView:

<UserControl ...> 
    <Grid> 
     <TextBlock Text="{Binding Name}" Background="Red" /> 
    </Grid> 
</UserControl> 

FactoryEmployeeView:

<UserControl ...> 
    <Grid> 
     <TextBlock Text="{Binding Name}" Background="Green" /> 
    </Grid> 
</UserControl> 

结果:

enter image description here

+0

这是非常接近我所需要的,反正,我必须要改变几行 'xlmns:的ViewModels = “CLR的命名空间:Solution.ViewModels”' 和改变的DataTemplates到: '