简体   繁体   English

如何在WPF中使用HierarchicalDataTemplate表示分层数据

[英]How to represent hierarchical DATA using HierarchicalDataTemplate in wpf

I am using MVVM and trying to represent my ViewModel data in View. 我正在使用MVVM,并尝试在View中表示我的ViewModel数据。

I have a class called Track containing list of Variations. 我有一个名为Track的类,其中包含变体列表。 I want to represent each variation as a TextBlock using data binding. 我想使用数据绑定将每个变体表示为TextBlock。

I am able to represent a single track as: 我能够将单个轨道表示为:

    <Window.Resources>
                <src:Track x:Key="trck"/>
                ...
    </Window.Resources>
    <StackPanel DataContext="{Binding Source={StaticResource trck}}" Orientation="Horizontal">
            <ItemsControl ItemsSource="{Binding Vars}" Height="53" Width="349">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Background="{Binding Path=color}" Height="15" Width="{Binding Path=elapsedtime}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
    </StackPanel>

I also have a class called TrackList containing collection of Tracks. 我还有一个名为TrackList的类,其中包含Tracks的集合。 I tried to use HierarchicalDataTemplate to represent Hierarchical Data of TrackList. 我尝试使用HierarchicalDataTemplate表示TrackList的分层数据。 But it's not working.. 但这不起作用..

I am new to WPF, and I have tried the below things so far: 我是WPF的新手,到目前为止,我已经尝试了以下操作:

    <DockPanel.Resources>
        <DataTemplate DataType="{x:Type src:Variation}">
            <TextBlock Background="{Binding Path=color}" Height="15" Width="{Binding Path=elapsedtime}"/>
        </DataTemplate>

        <HierarchicalDataTemplate DataType = "{x:Type src:Track}" ItemsSource = "{Binding Path=Vars}">
            <StackPanel/>
        </HierarchicalDataTemplate>
    </DockPanel.Resources>

public class TrackList : ViewModel
    {
        private ICollection<Track> tracks;
        private Track selectedTrack;
        public string Name 
        { get; set; }

        public TrackList()
        {
            this.tracks = new List<Track>();
            this.tracks.Add(new Track("T1"));
            this.tracks.Add(new Track("T2"));
            Name = "Track List";
            selectedTrack = tracks.ElementAt(1);
        }

        public ICollection<Track> Tracks
        {
            get { return this.Tracks; }
            set { this.Tracks = value; }
        }

        public Track SelectedTrack
        {
            get { return this.selectedTrack; }
            set
            {
                if (this.selectedTrack != value)
                {
                    this.selectedTrack = value;
                    this.OnPropertyChanged("SelectedTrack");
                }
            }
        }
    }

public class Track : ViewModel
    {
        private ICollection<Variation> vars;
        private Variation selectedVar;
        public string Name { get; set; }

        public Track()
        {
            Init();
        }

        public Track(string p)
        {
            // TODO: Complete member initialization
            this.Name = p;
            Init();
        }

        private void Init()
        {
            this.vars = new List<Variation>();
            this.vars.Add(new Variation("var1", 20, Brushes.Red));
            this.vars.Add(new Variation("var2", 60, Brushes.Green));
            this.vars.Add(new Variation("var3", 40, Brushes.Khaki));
            this.vars.Add(new Variation("var4", 120, Brushes.Aqua));
            selectedVar = vars.ElementAt(1);
        }

        public ICollection<Variation> Vars
        {
            get { return this.vars; }
            set { this.vars = value; }
        }

        public Variation SelectedVar
        {
            get { return this.selectedVar; }
            set
            {
                if (this.selectedVar != value)
                {
                    this.selectedVar = value;
                    this.OnPropertyChanged("SelectedVar");
                }
            }
        }
    }

public class Variation : ViewModel
    {
        public int elapsedtime { get; set; }

        public string Name { get; set; }

        public System.Windows.Media.Brush color { get; set; }

        public Variation(string varname)
        {
            Name = varname;
        }

        public Variation(string name, int time, System.Windows.Media.Brush br)
        {
            // TODO: Complete member initialization
            this.Name = name;
            this.elapsedtime = time;
            this.color = br;
        }
    }

public abstract class ViewModel : INotifyPropertyChanged
    {
        private readonly Dispatcher _dispatcher;

        protected ViewModel()
        {
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected Dispatcher Dispatcher
        {
            get { return _dispatcher; }
        }

        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
        {
            PropertyChanged(this, e);
        }

        protected void OnPropertyChanged(string propertyName)
        {
            OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
        }
    }

Please let me know for any farther information. 请让我知道更多信息。 Thanks 谢谢

You can represent your hierarchical data using a TreeView : 您可以使用TreeView表示分层数据:

<TreeView ItemsSource="{Binding Tracks}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type src:Track}" ItemsSource="{Binding Vars}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

I don't think you need HierarchicalDataTemplate , your tree has known number of levels (TrackList>Track>Variation). 我认为您不需要HierarchicalDataTemplate ,您的树具有已知数量的级别(TrackList> Track> Variation)。 You can simply do this: 您可以简单地做到这一点:

<DockPanel.Resources>
    <DataTemplate DataType="{x:Type src:Variation}">
        <TextBlock Background="{Binding Path=color}" Height="15" Width="{Binding Path=elapsedtime}"/>
    </DataTemplate>

    <DataTemplate DataType="{x:Type src:Track}">
        <StackPanel>
            <TextBlock Text="{Binding Name}"/>
            <ItemsControl ItemsSource="{Binding Vars}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
            </ItemsControl>
        </StackPanel>
    </DataTemplate>
</DockPanel.Resources>

<ItemsControl ItemsSource="{Binding Tracks}" />

Where ItemsControl bind to Tracks property of the TrackList (ItemsControl.DataContext = TrackList). 其中ItemsControl绑定到TrackList的Tracks属性(ItemsControl.DataContext = TrackList)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM