WPF Hierarchial Data Template类中的不同属性

时间:2017-10-11 13:51:40

标签: c# wpf

如何使树成为类的不同属性?

我想得到这样的东西

AMachine
-Wheels
Bmachine
-Years

Code.cs

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new TestViewModel();
        }
    }

    public class TestViewModel
    {
        public ObservableCollection<IBase> Items { get; set; }

        public TestViewModel()
        {
            Items = new ObservableCollection<IBase>();
            Items.Add(new AMachine { Wheels = "3", Name = "AMachine" });
            Items.Add(new BMachine { Years = "2", Name = "BMachine" });
        }
    }
    public interface IBase
    {

    }

    public class AMachine : IBase
    {
        public string Name { get; set; }
        public string Wheels { get; set; }
    }

    public class BMachine : IBase
    {
        public string Name { get; set; }
        public string Years { get; set; }
    }

Xaml.cs

<Grid>
        <TreeView Height="300" Width="300" ItemsSource="{Binding Items}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type self:IBase}" ItemsSource="{Binding Items}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}" />
                    </StackPanel>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>

1 个答案:

答案 0 :(得分:1)

这里你不需要分层数据模板,逻辑上是使用普通数据模板和ListBox(扩展器作为节点?):

<ListBox ItemsSource="{Binding Items}">
    <ListBox.Resources>
        <DataTemplate DataType="{x:Type local:AMachine}">
            <Expander Header="{Binding Name}">
                <TextBlock Text="{Binding Wheels}" />
            </Expander>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:BMachine}">
            <Expander Header="{Binding Name}">
                <TextBlock Text="{Binding Years}" />
            </Expander>
        </DataTemplate>
    </ListBox.Resources>
</ListBox>

enter image description here