2014-09-30 45 views
1

想象一个列表框中的多个对象类型。两者有不同的外观和呈现的信息。如果我在ObservableCollection中添加它们中的任何一个,它将在ListBox中显示它们。一个列表框的多个数据模板

<DataTemplate DataType="{x:Type local:DogData}" > 
    <Grid... 
</DataTemplate> 
<DataTemplate DataType="{x:Type local:CatData}" > 
    <Grid... 
</DataTemplate> 

现在,我希望用户能够按一个按钮,切换视图以查看更详细的信息,有模板,它提供

<DataTemplate x:Key="TemplateDogDataWithImages" > 
    <Grid... 
</DataTemplate> 
<DataTemplate x:Key="TemplateCatDataWithImages" > 
    <Grid... 
</DataTemplate> 

,但我只能分配一个

AnimalsListBox.ItemTemplate = this.Resources["TemplateDogDataWithImages"] as DataTemplate; 

我不想有一个,并有一堆触发器。

我已经研究DataTemplateSelectors http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector

有没有更好的办法?有没有办法为每个数据类型切换默认模板,所以我可以避免DataTemplateSelectors? 单击按钮时,如何选择TemplateDogDataWithImages和TemplateCatDataWithImages作为默认选项,并使用其他按钮使用TemplateDogDataSimple和TemplateCatDataSimple?

+4

DataTemplateSelectors可能是最简单的方法。 – Steve 2014-09-30 21:42:42

+0

你不能给'ListBox.ItemContainerStyle'属性赋一个'DataTemplate' ......线索就在它的名字里。此外,ListBox.ItemContainerStyle属性用于定义ListBoxItem而不是数据项。也许你的意思是'ListBox.ItemTemplate'属性? – Sheridan 2014-09-30 21:57:54

+0

@Sheridan是的,你是对的,意味着ItemTemplate。我正在改变它 – Daniel 2014-09-30 22:08:53

回答

0

我认为选择器更简单(少代码),但如果你真的想使用触发器,也许这样?

namespace WpfApplication65 
{ 
    public abstract class NotifyBase : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected void NotifyPropertyChanged(string property) 
     { 
      if(PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(property)); 
      } 
     } 
    } 

    public abstract class DataBase : NotifyBase 
    { 
     bool m_showDetailed; 
     public bool ShowDetailed 
     { 
      get { return m_showDetailed; } 
      set 
      { 
       m_showDetailed = value; 
       NotifyPropertyChanged("ShowDetailed"); 
      } 
     } 
    } 

    public class DogData : DataBase { } 
    public class CatData : DataBase { } 

    public partial class MainWindow : Window 
    { 
     public List<DataBase> Items { get; private set; } 

     public MainWindow() 
     { 
      Items = new List<DataBase>() { new DogData(), new CatData(), new DogData() }; 

      DataContext = this; 
      InitializeComponent(); 
     } 
    } 
} 

    <Window x:Class="WpfApplication65.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:l="clr-namespace:WpfApplication65" 
     Title="MainWindow" 
     WindowStartupLocation="CenterScreen"> 

    <Window.Resources> 
     <DataTemplate DataType="{x:Type l:CatData}"> 
      <DataTemplate.Resources> 
       <DataTemplate x:Key="basic"> 
        <TextBlock Text="This is the basic cat view" /> 
       </DataTemplate> 

       <DataTemplate x:Key="detailed"> 
        <TextBlock Text="This is the detailed cat view" /> 
       </DataTemplate> 
      </DataTemplate.Resources> 

      <Border BorderThickness="1" 
        BorderBrush="Red" 
        Margin="2" 
        Padding="2"> 
       <StackPanel> 
        <ContentPresenter Name="PART_Presenter" 
             ContentTemplate="{StaticResource basic}" /> 
        <CheckBox Content="Show Details" 
           IsChecked="{Binding ShowDetailed}" /> 
       </StackPanel> 
      </Border> 

      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding ShowDetailed}" 
          Value="True"> 
        <Setter TargetName="PART_Presenter" 
          Property="ContentTemplate" 
          Value="{StaticResource detailed}" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 

     <DataTemplate DataType="{x:Type l:DogData}"> 
      <DataTemplate.Resources> 
       <DataTemplate x:Key="basic"> 
        <TextBlock Text="This is the basic dog view" /> 
       </DataTemplate> 

       <DataTemplate x:Key="detailed"> 
        <TextBlock Text="This is the detailed dog view" /> 
       </DataTemplate> 
      </DataTemplate.Resources> 

      <Border BorderThickness="1" 
        BorderBrush="Blue" 
        Margin="2" 
        Padding="2"> 
       <StackPanel> 
        <ContentPresenter Name="PART_Presenter" 
             ContentTemplate="{StaticResource basic}" /> 
        <CheckBox Content="Show Details" 
           IsChecked="{Binding ShowDetailed}" /> 
       </StackPanel> 
      </Border> 

      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding ShowDetailed}" 
          Value="True"> 
        <Setter TargetName="PART_Presenter" 
          Property="ContentTemplate" 
          Value="{StaticResource detailed}" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </DataTemplate> 
    </Window.Resources> 

    <ListBox ItemsSource="{Binding Items}" /> 
</Window>