2016-01-18 31 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(); 
     } 
    }