Перейти к содержанию

WPF. Связывание TreeView с базой данных (поставщиком)


Рекомендуемые сообщения

Слова для поисковиков : TreeView, IsSynchronizedCurrentItem, DataSet, TreeView1SelectedItemChanged,реляционные данные...

post-3-1313396227,91_thumb.png

Если Вы начинающий разработчик WPF и не знаете, как связывать данные с TreeView как на рисунке выше, то я помогу Вам справиться с этой задачей. Решение этой задачи может показаться сложным Начинающим, но, тем не менее, я направлю на путь решения. Сначала я рассмотрю решение с XML данными, а реляционные данные оставлю на закуску.

Задача: отображать данные узла в TreeView при выделении этого узла.

1. XML данные

Начинающий разработчик привык к такому свойству как IsSynchronizedCurrentItem у различных контролов. Но у TreeView такое свойство отсутсвует. Почему оно отсутсвует Чёрт его знает. Это отсутсвие может обезкуражить, и спровоцировать нелучшие идеи решения данной задчи. Если Вы попытаетесь в посковике найти решение проблемы, то скорее всего вы ничего не найдете. Даже в MSDN я не нашёл конкретный пример.

Для решения задачи Вам надо мыслить как заядлый WPF-щик. Боже упаси, Вам придумать идею с обработкой события TreeView1SelectedItemChanged() внутри которого был бы код синхронизации.

Итак. Чтобы в правом поле ТекстБокса отображались данные xml нужно использовать следующую связку свойства-зависимости “Text”:


<TextBox Name="textBoxShowComment"
Text="{Binding ElementName=treeView1, Path=SelectedItem, Converter={StaticResource XmlElementConverter1}, Mode=OneWay}" />

Суть в том, что вы привязываете Текст именно к элементу TreeView->SelectedItem, который был только что выделен. Поскольку Item это объект тип которого зависит от поставщика данных, то надо использовать преобразователь. В данном случае это XmlElementConverter1.


[ValueConversion(typeof(XmlElement), typeof(string))]
public class XmlElementConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var element = value as XmlElement;
return element != null ? element.FirstChild.InnerText : "";
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// напишите свой код записи в element.FirstChild.InnerText
return null;
}
}

Эта разметка позволит вам лучше соориентироваться.

 <Window x:Class="CELua_Support2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="267" Width="637" WindowStartupLocation="CenterScreen" xmlns:my="clr-namespace:CELua_Support2">
<Window.Resources>
<XmlDataProvider x:Key="myDB" XPath="LuaDataSet/P">
<x:XData xmlns="">
<LuaDataSet revision="r1004">x1
<P name="Don Hall">x2
<P name="Alice Ciccu">x3
<P name="David Pelton">x4
<P name="Vivian Atlas">Комментарии1</P>
</P>
<P name="Andy Pelton">Комментарии2</P>
<P name="Andy Jacobs">Комментарии3</P>
</P>
<P name="Bill Malone">x5
<P name="Maurice Taylor">Комментарии4</P>
<P name="Sunil Uppal">Комментарии5</P>
<P name="Qiang Wang">Комментарии6</P>
</P>
</P>
</LuaDataSet>
</x:XData>
</XmlDataProvider>

<HierarchicalDataTemplate x:Key="ItemTemplate" ItemsSource="{Binding XPath=P}">
<TextBlock Text="{Binding XPath=@name}" ></TextBlock>
</HierarchicalDataTemplate>

<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True"/>
</Style>
<my:XmlElementConverter x:Key="XmlElementConverter1" />
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="244" />
<ColumnDefinition Width="279*" />
</Grid.ColumnDefinitions>
<TreeView x:Name="treeView1" ItemsSource="{Binding Source={StaticResource myDB}}" ItemTemplate="{StaticResource ItemTemplate}" />
<TextBox Name="textBoxShowComment" TextWrapping="Wrap" Grid.Column="1" Margin="5,0,0,0" BorderBrush="#FF828790" SelectionBrush="#FF828790" Text="{Binding ElementName=treeView1, Path=SelectedItem, Converter={StaticResource XmlElementConverter1}, Mode=OneWay}" />
<GridSplitter Grid.Column="1" HorizontalAlignment="Left" Name="gridSplitter1" Width="5" />
</Grid>
</Window>

2. Реляционные данные

По реляционным данным почитайте тутор(Josh Smith).

Напоминаю, что реляционные данные можно строить визуально в VisualStudio ипользуя таблицы и связи.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.