2016-01-18 34 views
1

是否可以根据属性而不是通常在wpf中看到的类类型来控制使用哪个DataTemplate节点。使用基于属性的数据模板

对我而言,我有一个团队列表,我想控制列表框中列出的每个团队的背景以及其他一些设计元素,例如根据哪个团队显示不同的标识。在我看来,根据团队名称创建数据模板似乎是最简单的。

你们如何建议我处理它。我不想为每个整个团队创建一个类对象。然而,如果一个团队没有一个默认的设计模板被使用,那么这将是理想的。

无论哪种方式,如果有人可以放在一起一个超级简单的例子Id欣赏它考虑我不知道如何做到这一点。

回答

1

从你所描述的看来,这些属性可以保留在Team类,你可以显示基于它们的内容!,但由于你可能需要一些复杂的东西,你可以使用一个DataTemplateSelector基本上你需要做的是:

首先:在资源区域定义你所需要的的DataTemplates加一个默认的,如果没有名字matche一个difined模板的球队,

可以说,这样的事情:

<Window.Resources> 
    <DataTemplate x:Key="DefaultnDataTemplate" DataType="{x:Type YourNameSpace:Team}"> 
     <Grid Background="LightGreen"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <TextBlock Text="DefaultnDataTemplate"/> 
      <TextBlock Text="{Binding Id}" Grid.Row="1" Grid.Column="0"/> 
      <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" Grid.Row="1" Grid.Column="1"/> 
      <TextBlock Text="{Binding Matches}" Grid.Row="1" Grid.Column="2"/> 
     </Grid> 
    </DataTemplate> 
    <DataTemplate x:Key="TeamADataTemplate" DataType="{x:Type YourNameSpace:Team}"> 
     <Grid Background="LightCoral"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <TextBlock Text="TeamADataTemplate"/> 
      <TextBlock Text="{Binding Id}" Grid.Row="1" Grid.Column="0"/> 
      <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" Grid.Row="1" Grid.Column="1"/> 
      <TextBlock Text="{Binding Matches}" Grid.Row="1" Grid.Column="2"/> 
     </Grid> 
    </DataTemplate> 
    <DataTemplate x:Key="TeamBDataTemplate" DataType="{x:Type YourNameSpace:Team}"> 
     <Grid Background="LightBlue"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="Auto"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="Auto"/> 
      </Grid.RowDefinitions> 
      <TextBlock Text="TeamBDataTemplate"/> 
      <TextBlock Text="{Binding Id}" Grid.Row="1" Grid.Column="0"/> 
      <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" Grid.Row="1" Grid.Column="1"/> 
      <TextBlock Text="{Binding Matches}" Grid.Row="1" Grid.Column="2"/> 
     </Grid> 
    </DataTemplate>   
</Window.Resources> 

添加DataTemplateSelector类,类将基本检查队名并返回相应DataTemplate

public class TeamDataTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate DefaultnDataTemplate { get; set; } 
    public DataTemplate TeamADataTemplate { get; set; } 
    public DataTemplate TeamBDataTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, 
       DependencyObject container) 
    { 
     var teamName = (item as Team).Name; 
     switch (teamName) 
     { 
      case "TeamA": 
       return TeamADataTemplate; 
      case "TeamB": 
       return TeamBDataTemplate; 
      default: 
       return DefaultnDataTemplate; 
     } 

    } 
} 

,添加类的实例向StaticResources,并将其指向到已定义的数据模板:

<YourNameSpace:TeamDataTemplateSelector x:Key="TeamDataTemplateSelector" TeamADataTemplate="{StaticResource TeamADataTemplate}" TeamBDataTemplate="{StaticResource TeamBDataTemplate}" DefaultnDataTemplate="{StaticResource DefaultnDataTemplate}"/> 

最后在列表中调用TemplateSelector:

<ListBox ItemsSource="{Binding Teams}" ItemTemplateSelector="{StaticResource TeamDataTemplateSelector}">  
</ListBox> 

这里我使用此示例中的模型:

public class Team 
{ 
    public string Name { get; set; } 
    public string Id { get; set; } 
    public string Matches { get; set; } 
} 
    private ObservableCollection<Team> _teams=new ObservableCollection<Team>() 
    { 
     new Team() 
     { 
      Id="1", 
      Matches = "45", 
      Name = "TeamA" 
     }, 
     new Team() 
     { 
      Id="1", 
      Matches = "45", 
      Name = "TeamB" 
     }, 
     new Team() 
     { 
      Id="1", 
      Matches = "45", 
      Name = "TeamC" 
     } 
    }; 



    public ObservableCollection<Team> Teams 
    { 
     get 
     { 
      return _teams; 
     } 

     set 
     { 
      if (_teams == value) 
      { 
       return; 
      } 

      _teams = value; 
      OnPropertyChanged(); 
     } 
    }