powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF TreeView (VS2012)
6 сообщений из 6, страница 1 из 1
WPF TreeView (VS2012)
    #38770621
Kapu4ino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,
подскажите пожалуста, как сделать построение по данным из XML файла дерева WPF TreeView в Visual Studio 2012?
...
Рейтинг: 0 / 0
WPF TreeView (VS2012)
    #38771490
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
WPF TreeView (VS2012)
    #38772706
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya81,

используй Иерархические шаблоны,
создай базовую модель BaseTreeViewModel, создай в нем абстрактный метод загрузки потомков, свойства развёрнутости и выделенности, на её основе классы которые будут загружаться из модели данных путём сериализации или как вы будите парсить xml прикрутить к элементу TreeView нужную коллекцию и готово
...
Рейтинг: 0 / 0
WPF TreeView (VS2012)
    #38772755
Ilya81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Человек просил описать вывод XML, для этого есть Binding по XPath с использованием XmlDataProvider - об этом и приведённый пример. Как вариант, если в других элементах управления нужен не только XML, можно в свойство какого-то view model запихнуть XmlDataProvider и назначить только для TreeView этой свойство DataContext'ом.
...
Рейтинг: 0 / 0
WPF TreeView (VS2012)
    #38778705
Kapu4ino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

можете пример скинуть?
а то как то не понимаю всё вместе в целом полную картину
...
Рейтинг: 0 / 0
WPF TreeView (VS2012)
    #38778921
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kapu4ino,

ну я бы наверное примерно так делал:

для элементов дерева, я бы создал базовый класс BaseTreeItem, все остальные элементы дерева должно его наследовать, с помощью него я смогу через ViewModel выделить нужный элемент и узнать какие элементы открыты или закрыты, загружать данные и т.д.
Для разных нод, можно создать разные классы на базе BaseTreeItem, а в TreeView можно задать селектор шаблон, тогда разные элементы в дереве будут представленные по разному.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
    public abstract class BaseTreeItem : INotifyPropertyChanged
    {
        public static BaseTreeItem LoadingItem = new LoadingItem();
        private bool _isExpanded;
        private bool _isSelected;
        private bool _hasItems;

        protected BaseTreeItem()
        {
            Children = new ObservableCollection<BaseTreeItem>();
        }

        public bool IsSelected
        {
            set
            {
                if (value.Equals(_isSelected)) return;
                _isSelected = value;
                OnPropertyChanged("IsSelected");
            }
            get { return _isSelected; }
        }

        public bool IsExpanded
        {
            set
            {
                if (value.Equals(_isExpanded)) return;

                _isExpanded = value;
                OnPropertyChanged("IsExpanded");

                Children.Clear();
                LoadChildren();
            }
            get { return _isExpanded; }
        }

        public abstract string DisplayName { set; get; }

        public bool HasItems

        {
            set
            {
                if (value)
                {
                    Children.Add(LoadingItem);
                }
                else
                {
                    Children.Clear();
                }
                _hasItems = value;
            }
            get { return _hasItems; }
        }

        public abstract void LoadChildren();

        public BaseTreeItem Paren { set; get; }

        public ObservableCollection<BaseTreeItem> Children { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public sealed class LoadingItem : BaseTreeItem
    {
        public override string DisplayName
        {
            get
            {
                return "Loading";
            }
            set
            {
                throw new Exception("Can't change displayname");
            }
        }
        public override void LoadChildren() {}
    }

    public class XmlTreeItem : BaseTreeItem
    {
        private readonly XmlNode _node;

        public XmlTreeItem(XmlNode node)
        {
            _node = node;
            HasItems = _node.ChildNodes.Count > 0;
        }

        public override void LoadChildren()
        {
            foreach (XmlNode i in _node.ChildNodes)
                Children.Add(new XmlTreeItem(i));
        }

        public override string DisplayName
        {
            get
            {
                if (_node == null) return "Null refrense";
                var result = _node.Attributes != null && _node.Attributes["Name"] != null 
                    ? _node.Attributes["Name"].Value : _node.Name;
                return result;
            }
            set
            {
                throw new Exception("Can't change displayname");
            }
        }
    }



ViewModel'ь:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
    public class ViewModel
    {
        public const string XmlSource =
@"<Root>
  <Names>
    <Name Key=""0"" Name=""Roman""/>
    <Name Key=""1"" Name=""Dmitriy"" />
    <Name Key=""2"" Name=""Alexandr"" />
  </Names>
  <Surnames>
    <Surname Key=""0"" Name=""Mejtes""/>
    <Surname Key=""1"" Name=""Pupkin"" />
    <Surname Key=""2"" />
  </Surnames>
</Root>";

        public ViewModel()
        {
            MakeXmlRoot();
        }

        private void MakeXmlRoot()
        {
            var document = new XmlDocument();
            document.LoadXml(XmlSource);
            RootElements = new ObservableCollection<BaseTreeItem> { new XmlTreeItem(document.ChildNodes[0]) };

        }
        public ObservableCollection<BaseTreeItem> RootElements  { set;  get; }
    }



ну и сама View, обязательно нужно указать в Binding'е к IsSeleted и IsExpanded Mode = TwoWay, так как по умолчанию они OneWay

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    <TreeView ItemsSource="{Binding RootElements}">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
            </Style>
        </TreeView.ItemContainerStyle>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}" >
                <TextBlock Text="{Binding DisplayName}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF TreeView (VS2012)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]