将对象列表绑定到TreeView

时间:2017-03-21 20:38:10

标签: c# wpf xaml treeview

我有一个对象列表,我正在尝试将它绑定到WPF中的TreeView:

private List<SlideIssue> slideIssuesList = new List<SlideIssue>();

这里是XAML:

<Grid Grid.Row="2">
    <TreeView x:Name="mainTreeView" BorderThickness="0">

    </TreeView>
</Grid>

绑定尝试:

TreeViewItem item = new TreeViewItem();
item.HeaderTemplate = headerTemplate;

foreach (var issue in slideIssuesList)
{
    if (slideNumber == issue.SlideNumber)
    {                                            
        TreeViewItem child = new TreeViewItem();

        child.ItemsSource = slideIssuesList;

        child.HeaderTemplate = itemTemplate;
        item.Items.Add(child);
    }
}
item.IsExpanded = true; 
mainTreeView.Items.Add(item);

在运行时,这就是我得到的:

Here is the picture

我想访问“SlideIssue”对象的特定属性。我该怎么做?

2 个答案:

答案 0 :(得分:1)

您需要覆盖SlideIssue类中的ToString()方法。 当你绑定任何对象来控制它时,调用ToString()方法来打印数据,如果没有覆盖ToString(),则打印引用类名。

答案 1 :(得分:1)

您可以为DataTemplate类型定义SlideIssue,并将模板中的任何元素绑定到任何类“public属性:

<TreeView x:Name="mainTreeView" BorderThickness="0"
                  xmlns:local="clr-namespace:WpfApplication1">
    <TreeView.Resources>
        <DataTemplate DataType="{x:Type local:SlideIssue}">
            <StackPanel>
                <TextBlock Text="{Binding SlideNumber}" />
                <TextBlock Text="{Binding SomeOtherPropertyOfSlideIssue}" />
            </StackPanel>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

将“WpfApplication1”更改为定义namespace类的SlideIssue名称。

  

它有点有效。但我在C#中构建了一个复杂的模板,所以我更喜欢从那里创建它。我只有一个问题:你能帮我把这行代码写成C#吗?

以编程方式创建DataTemplate的最简单方法是使用XamlReader.Parse方法:

DataTemplate dataTemplate = System.Windows.Markup.XamlReader.Parse("<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:local=\"clr-namespace:WpfApplication1;assembly=WpfApplication1\" DataType=\"{x:Type local:SlideIssue}\"><StackPanel><TextBlock Text=\"{Binding SlideNumber}\" /><TextBlock Text=\"{Binding SomeOtherPropertyOfSlideIssue}\" /></StackPanel></DataTemplate>") as DataTemplate;

请记住将“WpfApplication1”替换为定义SlideIssue类的命名空间和程序集的实际名称。