Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Корректное отображение TreeView / 18 сообщений из 18, страница 1 из 1
14.11.2011, 10:09
    #37524940
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
Добрый день.
Задача: с помощью рекурсивного WCF-сервиса (дергает SP. Процедура отрабатывает корректно) построить дерево "ОКАТО".
WCF-сервис принимает в качестве параметра одну переменную <код>, и возвращает строки (List<>) , содержащие
<код>, <наименование>, <имеются ли дочерние записи>.
Делаю так:
Класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#region OKATO
        ObservableCollection<OKATODataItem> refOKATOTree;
        public class OKATODataItem
        {
            public string Name { get; set; }
            public string NCode { get; set; }
            public int? HasChild { get; set; }
            public ObservableCollection<OKATODataItem> Child = new ObservableCollection<OKATODataItem>();            
        }
        #endregion

Метод при раскрытии узла:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
private void rtvOKATO_LoadOnDemand(object sender, Telerik.Windows.RadRoutedEventArgs e)
        {
            RadTreeViewItem item = (e.OriginalSource as RadTreeViewItem);
            if (item != null)
            {
                OKATODataItem v_OKATO = item.Item as OKATODataItem;
                if (v_OKATO != null)
                {
                    st.GetChildOKATOAsync(v_OKATO.NCode);
                }
                else
                {
                    item.IsLoadOnDemandEnabled = false;
                }
            }
        }

Код XAML:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 <UserControl.Resources>
        <telerik:HierarchicalDataTemplate x:Key="ChildTemplate" 
                                          ItemsSource="{Binding Child}">
            <TextBlock Text="{Binding Path=Name}" />
        </telerik:HierarchicalDataTemplate>
        <telerik:HierarchicalDataTemplate x:Key="RootTemplate" 
                                          ItemTemplate="{StaticResource ChildTemplate}" 
                                          ItemsSource="{Binding Path=Child}">
            <TextBlock Text="{Binding Name}" />
        </telerik:HierarchicalDataTemplate>
    </UserControl.Resources>

Код: plaintext
1.
2.
3.
4.
<telerik:RadTreeView IsEditable="False" IsSingleExpandPath="True" IsLoadOnDemandEnabled="True" IsExpandOnDblClickEnabled="True" Grid.Row="1"  
                             HorizontalAlignment="Stretch"  Name="rtvOKATO" ItemsIndent="20" VerticalAlignment="Stretch" 
                             LoadOnDemand="rtvOKATO_LoadOnDemand" ItemTemplate="{Binding Source={StaticResource RootTemplate}}" Margin="0,0,228,0">
        </telerik:RadTreeView>


В результате данные в дереве появляются, но при этом не формируются узлы, а данные просто добавляются в конец.
В данном примере используется библиотека Telerik, но и в обычной sdk все то же самое.
Подозреваю, что где-то в HierarchicalDataTemplate я накосячил...
Но где именно - разобраться не могу. В чем я не прав?
...
Рейтинг: 0 / 0
14.11.2011, 10:40
    #37524978
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
ты не прав, в том, что сформировал не очень качественный вопрос.
...
Рейтинг: 0 / 0
14.11.2011, 10:49
    #37524989
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
AlexeiKты не прав, в том, что сформировал не очень качественный вопрос.

А что не так с вопросом? Вроде все понятно в вопросе...
...
Рейтинг: 0 / 0
14.11.2011, 11:12
    #37525034
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
new_silverlither,

да, все понятно, но только тебе :)
...
Рейтинг: 0 / 0
14.11.2011, 11:27
    #37525075
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
AlexeiKnew_silverlither,

да, все понятно, но только тебе :)

Уточню получаемый результат. Может прояснится немного..:))

Результат, получаемый при выборе субъекта, нормальный.
А вот когда пытаемся раскрыть любой узел, получается не так, как должно было бы быть.
...
Рейтинг: 0 / 0
14.11.2011, 11:30
    #37525080
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
new_silverlitherРезультат, получаемый при выборе субъекта, нормальный.
А вот когда пытаемся раскрыть любой узел, получается не так, как должно было бы быть.
Не могу картинку со скрином вставить. Размер - 14 килобайт.
...
Рейтинг: 0 / 0
14.11.2011, 11:33
    #37525090
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
Попытаюсь объяснить словами.

TreeView при попытке раскрыть любой узел не раскрывает его, а добавляет вновь полученные данные, которые должны были бы составлять дочерний список, в конец списка, и делает их родительскими узлами.
Т.е. поведение как у обычного ListBox.

Все еще не понятно?
...
Рейтинг: 0 / 0
14.11.2011, 11:36
    #37525097
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
ага не понятно.
Код: plaintext
st.GetChildOKATOAsync(v_OKATO.NCode);
вот это не понятно.
...
Рейтинг: 0 / 0
14.11.2011, 11:43
    #37525122
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
AlexeiKага не понятно.
Код: plaintext
st.GetChildOKATOAsync(v_OKATO.NCode);
вот это не понятно.

Это вызов сервиса, который должен возвратить очередную порцию данных
Вот код завершения:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void st_GetChildOKATOCompleted(object sender, SrTree.GetChildOKATOCompletedEventArgs e)
        {
            if (e.Error == null && e.Result != null)
            {
                foreach (SrTree.GetChildOKATO_Result item in e.Result)
                {
                    OKATODataItem t = new OKATODataItem();
                    t.Name = item.Name;
                    t.NCode = item.NCode;
                    t.HasChild = item.HasChild;
                    refOKATOTree.Add(t);
                }
            }            
        }

Дело в том, что данные возвращаются именно те, которые нужны, но дерево не строится.
Код при инициализации
Код: plaintext
1.
2.
3.
4.
5.
6.
public Home()
        {
            InitializeComponent();
            rtvOKATO.ItemsSource = this.refOKATOTree;
            refOKATOTree = new ObservableCollection<OKATODataItem>();            
        }
...
Рейтинг: 0 / 0
14.11.2011, 13:13
    #37525332
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
а каким кодом, ты указываешь, что пришедших детей, нужно прикрепить к родителю?
у тебя там, такой код, что типа просто добавить в конец дерева.
нигде нету ссылки, что нужно добавить именно к родителю.
...
Рейтинг: 0 / 0
14.11.2011, 14:10
    #37525481
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
AlexeiKа каким кодом, ты указываешь, что пришедших детей, нужно прикрепить к родителю?
у тебя там, такой код, что типа просто добавить в конец дерева.
нигде нету ссылки, что нужно добавить именно к родителю.

Согласен. Исправил на
Код: plaintext
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.
void st_GetChildOKATOCompleted(object sender, SrTree.GetChildOKATOCompletedEventArgs e)
        {
            if (e.Error == null && e.Result != null)
            {
                foreach (SrTree.GetChildOKATO_Result item in e.Result)
                {
                    OKATODataItem t = new OKATODataItem();
                    t.Name = item.Name;
                    t.NCode = item.NCode;
                    t.HasChild = item.HasChild;
                    if (tokato != null)
                    {
                        var temp = refOKATOTree.FirstOrDefault<OKATODataItem>(p => p.NCode == tokato.NCode);
                        if (temp != default(OKATODataItem))
                            temp.Child.Add(t);
                        else refOKATOTree.Add(t);
                    }
                    else refOKATOTree.Add(t);
                }
            }            
        }

        private OKATODataItem tokato;

        private void rtvOKATO_LoadOnDemand(object sender, Telerik.Windows.RadRoutedEventArgs e)
        {
            RadTreeViewItem item = (e.OriginalSource as RadTreeViewItem);
            
            if (item != null)
            {
                tokato = (item.Item as OKATODataItem);
                OKATODataItem v_OKATO = item.Item as OKATODataItem;
                if (v_OKATO != null)
                {
                    st.GetChildOKATOAsync(v_OKATO.NCode);
                }
                else
                {
                    item.IsLoadOnDemandEnabled = false;
                }
            }
        }

Так же XAML подправил.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<telerik:RadTreeView IsEditable="False" IsSingleExpandPath="True" IsLoadOnDemandEnabled="True" IsExpandOnDblClickEnabled="True" Grid.Row="1"  
                             HorizontalAlignment="Stretch"  x:Name="rtvOKATO" ItemsIndent="20" VerticalAlignment="Stretch" 
                             LoadOnDemand="rtvOKATO_LoadOnDemand"  Margin="0,0,228,0">
            <telerik:RadTreeView.ItemTemplate>
                <telerik:HierarchicalDataTemplate ItemsSource="{Binding Child}" >
                    <TextBlock Text="{Binding Name}"/>
                </telerik:HierarchicalDataTemplate>
            </telerik:RadTreeView.ItemTemplate>
        </telerik:RadTreeView>

Теперь результат другой.
Узлы просто не раскрываются. Как будто бы в них нет данных.
Но данные ТОЧНО есть и они в класс заполняются как положено, к родителю, т.е. к текущему узлу.
...
Рейтинг: 0 / 0
14.11.2011, 14:20
    #37525507
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
а ошибки Binding студия какие показывает в immediate window или output?
...
Рейтинг: 0 / 0
14.11.2011, 14:29
    #37525537
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
AlexeiKа ошибки Binding студия какие показывает в immediate window или output?

Ошибок Binding нет.
Ошибок вообще никаких нет.
Даже предупреждений.
...
Рейтинг: 0 / 0
14.11.2011, 14:35
    #37525551
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
а wpf или sl?
...
Рейтинг: 0 / 0
14.11.2011, 14:49
    #37525591
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
AlexeiKа wpf или sl?

Silverlight

Сейчас еще в режиме Debug с помощью Wath проверил свойство ItemsSource у TreeView.
Все заполняется корректно. Но не отображается.
...
Рейтинг: 0 / 0
14.11.2011, 15:38
    #37525736
AlexeiK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
new_silverlither,

ок ?
...
Рейтинг: 0 / 0
14.11.2011, 16:19
    #37525845
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
AlexeiKnew_silverlither,

ок ?

Да. Эта опция включена.
Все нормально. Ошибок нет.
...
Рейтинг: 0 / 0
15.11.2011, 15:33
    #37527492
new_silverlither
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректное отображение TreeView
Все проблемы решены.
Все работает очень корректно и очень быстро.

AlexeiK, большое спасибо за участие и посильную помощь.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Корректное отображение TreeView / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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