Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TreeView DataBinding 
V
    Опции темы
Ronin08
Дата 7.7.2011, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



Доброго времени суток
Имеется таблица адресов в БД с полями
  • Addr_Id    - id записи
  • Name        -  название
  • ParentId   - id родителя записи 
  • Level         - уровень записи (1 - города; 2- район; 3 - улица)
  • Abbrev       - сокращение
т.е имеем древовидную структуру
улица ссылается(ParentId) на район, район ссылается(ParentId) на город у города ParentId = null
Использую Entity Framework. Получил объект Addresses c такими же именами свойствами как и имена полей.

Теперь нужно в дереве отобразить города и районы. 

Первый уровень заполняю так

Код

using (_context = new WMModelContainer())
{
      var query = from c in _context.Addresses
                          where c.Level == 1
                          select c;

      trvAddress.ItemsSource = query;
}


как сделать чтобы  при кликании на город отображались дочерние элементы(районы)? 



Это сообщение отредактировал(а) Ronin08 - 7.7.2011, 15:57
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Kefir
Дата 8.7.2011, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 22
Всего: 87



Я полагаю, что навигационные св-ва в твоих объектах имеются, поэтому используй HierarchicalDataTemplate ;)
http://msdn.microsoft.com/en-us/library/ms742521.aspx
PM MAIL WWW Skype   Вверх
Ronin08
Дата 8.7.2011, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



в смысле навигационные свойства?
В моем случае каждый объект c Addresses.Level > 1 имеет ссылку на другой объект в этой же коллекции!
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Kefir
Дата 8.7.2011, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 22
Всего: 87



Ну энивей, имея парента ты можешь получить его киндеров (хотя бы Addresses.Where(o => o.ParentId == someParentId)). Сделай HierarchicalDataTemplate и привязывайся к детям. 

А про навигационные св-ва я говорил в контексте Entity Framework. Там же можно иметь Navigation Property, через которые получать детей.
PM MAIL WWW Skype   Вверх
Ronin08
Дата 8.7.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



Цитата

Я полагаю, что навигационные св-ва в твоих объектах имеются

Цитата

А про навигационные св-ва я говорил в контексте Entity Framework.

Да имеются!
Цитата

Сделай HierarchicalDataTemplate и привязывайся к детям. 

А вот в этом как раз проблема! Я пытался сделать так
Код

<Window.Resources>
        <CollectionViewSource x:Key="addressViewSource" d:DesignSource="{d:DesignInstance my:Address, CreateList=True}" />
        <CollectionViewSource x:Key="addressAddresses1ViewSource" Source="{Binding Path=Addresses1, Source={StaticResource addressViewSource}}" />

        <HierarchicalDataTemplate x:Key="hrtTmpl2" DataType="{x:Type my:Address}" ItemsSource="{Binding Source={StaticResource addressAddresses1ViewSource}}">
            <TextBlock Text="{Binding Path=Name}"/>
        </HierarchicalDataTemplate>
        
        <HierarchicalDataTemplate x:Key="hrtTmpl1" DataType="{x:Type my:Address}"  ItemsSource="{Binding}" ItemTemplate="{StaticResource hrtTmpl2}" >
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
        
    </Window.Resources>
<Grid DataContext="{StaticResource addressViewSource}">

<TreeView Height="160" HorizontalAlignment="Left" Width="220" Margin="0,111,0,0" 
                  ItemsSource="{Binding}" 
                  ItemTemplate="{StaticResource hrtTmpl1}">
</TreeView>
</Grid>

Код

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            System.Windows.Data.CollectionViewSource addressViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("addressViewSource")));
           
             var _context = new WMModelContainer();
             var query = from c in _context.Addresses
                                select c;

             addressViewSource.Source = query;
           
        }

Но в данном случае все элементы отображаются на верхнем уровне  
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Kefir
Дата 9.7.2011, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 22
Всего: 87



Ну хорошо. В общем так - тебе надо:
1) Список корневых элементов
2) Правильный дата темплейт

Вот тут у тебя была правильная выборка корневых элементов
Код

var query = from c in _context.Addresses
                          where c.Level == 1
                          select c;


Правильный дата темплейт (твой почти правильный):
Код

<HierarchicalDataTemplate x:Key="hrtTmpl1" DataType="{x:Type my:Address}" ItemsSource="{Binding Children}">
        <TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>

(обрати внимание что в ItemsSource темплейта прописывать надо путь к детям)
PM MAIL WWW Skype   Вверх
Ronin08
Дата 10.7.2011, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: нет
Всего: 1



Kefir, спасибо, получилось, только появился сопутствующий вопрос. у меня всего в БД для этой таблицы 3 уровня иерархии, но надо чтобы в TreeView отображалось только 2!, т.е. Где Level = 1 или 2. Как это можно сделать?
Думал сделать вьюху в БД (где Level = 1,2), но тогда не будет навигационных свойств! и не получится построить иерархию. 

Это сообщение отредактировал(а) Ronin08 - 10.7.2011, 01:23
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Kefir
Дата 11.7.2011, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 22
Всего: 87



Можешь сделать банально прокси св-во в твоём классе по типу
Код

public ICollection<Address> SpecialChildren
{
    get { return this.Level < 2 ? this.Children : null }
}


И привязывайся к этому св-ву - оно будет смотреть - если уровень себя больше двух, то детей возвращать просто не будет. И в добавок (если есть надобность в авто-обновлении детей) - используй CollectionView / ListCollectionView.
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.