一个ListBox的多个DataTemplates

时间:2014-09-30 21:40:14

标签: c# wpf

想象一个列表框中的多个对象类型。两者都有不同的外观和呈现信息。如果我在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来修复其他按钮?

1 个答案:

答案 0 :(得分: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>