简体   繁体   中英

wpf using DataTemplate into HierachicalDataTemplate

in Wpf application i've to show the same collection of items into a ListBox and TreeView, The List show only the first level, the TreeView the whole Hierarchical. My Question is: why in the TreeView is not applied the DataTemplate i declared for Item object? how do i can share the same DataTemplate across the 2 controls (the color of text into TV must be red)?

<Window x:Class="TestWpf.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:viewmodel="clr-namespace:TestWpf"
    >
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>

    <Grid.Resources>
        <DataTemplate DataType="{x:Type viewmodel:Item}">
            <TextBlock Foreground="Red" Text="{Binding Caption}"></TextBlock>
        </DataTemplate>
    </Grid.Resources>
    <ListBox Grid.Row="0" Name="lb1" ></ListBox>
    <TreeView Name="tv1"  Grid.Row="1" >
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type viewmodel:Item}" ItemsSource="{Binding Items}" >

            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>
</Grid>

MainWindow.cs

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TestWpf
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();

        ObservableCollection<Item> Items = new ObservableCollection<Item>();

        var item1 = new Item("1");
        Items.Add(item1);

        item1.Items.Add(new Item("1.1"));
        item1.Items.Add(new Item("1.2"));
        item1.Items.Add(new Item("1.3"));

        var item2 = new Item("2");
        Items.Add(item2);

        item2.Items.Add(new Item("2.1"));
        item2.Items.Add(new Item("2.2"));
        item2.Items.Add(new Item("2.3"));

            var item3 = new Item("3");
            Items.Add(item3);

            item3.Items.Add(new Item("3.1"));
            item3.Items.Add(new Item("3.2"));
            item3.Items.Add(new Item("3.3"));

            this.lb1.ItemsSource = Items;
            this.tv1.ItemsSource = Items;
        }
    }
}

Item.cs

namespace TestWpf
{
    public class Item
    {
        public List<Item> Items { get; set; }
        public string Caption { get; set; }
        public Item(string caption)
        {
            this.Caption = caption;
            this.Items = new List<Item>();
        }
    }
}

I just copy and pasted your code in VS, pressed F5 and it worked. The only thing i had to change was the namespace since i created it with WPFApplication1 :)

Try taking your code out to a fresh project and try to build it and see if it works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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