WPF Tree не работает - PullRequest
       15

WPF Tree не работает

2 голосов
/ 23 марта 2010

Не могли бы вы сказать мне, почему я не вижу подэлементы?

У меня есть приложения winforms, и я добавил свой wpfusercontrol: ObjectsAndZonesTree

ServiceProvider - это мой веб-сервис. Метод Adn для получения listofcountires с подэлементами работает должным образом (я получаю страны, регионы из этих стран, провинции и т. Д ...)

 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;
            }
        }
}

Показывает мне только список стран.

Ответы [ 4 ]

2 голосов
/ 01 апреля 2010

Ваш Регион 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>

Так, например, если вы добавите Города в свои Провинции , изменения в вашем 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>
1 голос
/ 06 апреля 2010

Не уверен, в чем ваша проблема, но я подумал, что поделюсь с вами лучшим ресурсом, который я нашел при работе с Treeview. То, что методы расширения избавили меня от хлопот:

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

Они преобразуют любой плоский список в Ienumerable HierarchyNode, используя приятный лямбда-синтаксис. Он реализован с помощью IQueryable, что означает эффективность даже в отношении текста данных linq.

0 голосов
/ 06 апреля 2010

Вам понадобятся HierarchialDataTemplates вместо простых DataTemplates.

Остальные все написали, поэтому я выложу несколько полезных ссылок:

http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

http://blogs.msdn.com/mikehillberg/archive/2006/10/11/a-treeview-a-hierarchicaldatatemplate-and-a-2d-collection-walk-into-a-bar.aspx

http://msdn.microsoft.com/en-us/library/system.windows.hierarchicaldatatemplate.aspx

0 голосов
/ 24 марта 2010

Реализовали ли вы INotifyPropertyChanged в классе источника Binding?

Кроме того, вы можете проверить исключения привязки в окне вывода Visual Studio.Это поможет вам понять недопустимые привязки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...