【问题标题】:WPF Tree doesn't workWPF 树不起作用
【发布时间】:2010-03-23 12:49:48
【问题描述】:

你能告诉我为什么我看不到子项目吗?

我有 winforms 应用程序并添加了我的 wpfusercontrol:ObjectsAndZonesTree

ServiceProvider 是我的网络服务。获取带有子项的国家列表的 Adn 方法正常工作(我从这个国家、省份等获得国家、地区……)

 ElementHost elementHost = new ElementHost
                                          {
                                              Width = 150,
                                              Height = 50,
                                              Dock = DockStyle.Fill,
                                              Child = new ObjectsAndZonesTree()
                                          };


            this.splitContainer3.Panel1.Controls.Add(elementHost);

XAML:

<TreeView Name="GroupView" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding}">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type ServiceProvider:Country
}" ItemsSource="{Binding Items}">
                <TextBlock Text="{Binding Path=Name}" />
                </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type ServiceProvider:Region}" >
                <TextBlock Text="{Binding Path=Name}" />
                </DataTemplate>
            <DataTemplate DataType="{x:Type ServiceProvider:Province}" >
                <TextBlock Text="{Binding Path=Name}" />
                </DataTemplate>
        </TreeView.Resources>
    </TreeView>

XAML.CS

 public ObjectsAndZonesTree()
        {
            InitializeComponent();

            LoadView();
        }

        private void LoadView()
        {
            GroupView.ItemsSource = new ServiceProvider().GetListOfObjectsAndZones();

        }

班级国家:

public class Country
    {
        string _name;

        [XmlAttribute]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        string _code;

        [XmlAttribute]
        public string Code
        {
            get { return _code; }
            set { _code = value; }
        }

        string _continentCode;

        [XmlAttribute]
        public string ContinentCode
        {
            get { return _continentCode; }
            set { _continentCode = value; }
        }

        public Region[] ListOfRegions
        {
            get { return _listOfRegions; }
            set { _listOfRegions = value; }
        }

        private Region[] _listOfRegions;

        public IList<object> Items
        {
            get
            {
                IList<object> childNodes = new List<object>();
                foreach (var group in this.ListOfRegions)
                    childNodes.Add(group);

                return childNodes;
            }
        }



    }

类区域:

公开课区域 {

private Province[] _listOfProvinces;
        private string _name;
        private string _code;

        public Province[] ListOfProvinces
        {
            get { return _listOfProvinces; }
            set { _listOfProvinces = value; }
        }

        public string Name
        {
            get {
                return _name;
            }
            set {
                _name = value;
            }
        }

        public string Code
        {
            get {
                return _code;
            }
            set {
                _code = value;
            }
        }

        public string CountryCode
        {
            get { return _countryCode; }
            set { _countryCode = value; }
        }

        private string _countryCode;

        public IList<object> Items
        {
            get
            {
                IList<object> childNodes = new List<object>();
                foreach (var group in this.ListOfProvinces)
                    childNodes.Add(group);

                return childNodes;
            }
        }
}

它只显示我的国家列表。

【问题讨论】:

  • @Phenevo:你还在烦恼吗?

标签: c# wpf winforms treeview


【解决方案1】:

您的区域DataTemplate 需要是HierarchicalDataTemplate 才能支持嵌套项(子项)。您还需要指定它是ItemsSource

<TreeView Name="GroupView" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type ServiceProvider:Country}"
                                  ItemsSource="{Binding Items}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type ServiceProvider:Region}" 
                                  ItemsSource="{Binding Items}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type ServiceProvider:Province}">
            <TextBlock Text="{Binding Path=Name}" />
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

例如,如果您将 Cities 添加到您的 Provinces,则 XAML 中的更改可能看起来像这样。

        <HierarchicalDataTemplate DataType="{x:Type ServiceProvider:Province}" 
                                  ItemsSource="{Binding Cities}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>

        <DataTemplate DataType="{x:Type ServiceProvider:City}">
            <TextBlock Text="{Binding Path=Name}" />
        </DataTemplate>

【讨论】:

    【解决方案2】:

    不确定您的问题出在哪里,但我想我会与您分享我在处理 Treeview 时发现的最佳资源。这些扩展方法为我省去了很多麻烦:

    http://www.scip.be/index.php?Page=ArticlesNET23

    他们使用一些不错的 lambda 语法将任何平面列表转换为 HierarchyNode 的 Ienumerable。它是使用 IQueryable 实现的,这意味着即使针对 linq 数据上下文也很高效。

    【讨论】:

      【解决方案3】:

      你是否在 Binding 源类上实现了 INotifyPropertyChanged??

      此外,您还可以在 Visual Studio 的输出窗口中检查绑定异常。 它将帮助您理解无效的绑定。

      【讨论】:

        【解决方案4】:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-08
        • 2010-12-22
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 1970-01-01
        相关资源
        最近更新 更多