Как стать автором
Поиск
Написать публикацию
Обновить

Простое применение DataTemplate

Время на прочтение4 мин
Количество просмотров24K
Добрый день.
Для меня, моя жизнь как программиста, делится на два этапа. До того как я познакомился с WPF, и после. Мне пришлось очень плотно работать с этой технологией в рамках одного проекта, в результате чего я приобрёл некоторые знания, которыми хочу с вами поделиться. То что написано ниже, не откровения, и для тех кто знаком с WPF может показаться банальностью. Всё это описано в сети, в том или ином виде, проще или сложнее, но есть у всех этих описаний одна особенность — английский язык. Поэтому я приведу ниже очень короткий, но как мне кажется ёмкий пример того, что можно сделать при помощи Data Templates. Особенно этот пример будет интересен тем, кто только посматривает в сторону WPF.

Вот такой вот короткий файлик.
<Grid   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
 <Grid.Resources>
 

   <XmlDataProvider x:Key="rss"
   Source="http://informer.gismeteo.ua/rss/99882.xml"
   XPath="/rss/channel"/>
  
   <DataTemplate DataType="item">
   <StackPanel>
   <TextBlock Text="{Binding XPath=title}"/>
    <TextBlock TextWrapping="Wrap" Width="360"    Text="{Binding XPath=description}"/>
   <Image Margin="15,15,0,0"   
            Stretch="None" 
            HorizontalAlignment="Left"    
            Source="{Binding XPath=enclosure/@url}" />
    </StackPanel>
    </DataTemplate>
   
 </Grid.Resources>

<Border BorderBrush="Black"
    BorderThickness="1" Width="360" Height="200" CornerRadius="6">

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ItemsSource="{Binding Source={StaticResource rss}, XPath=item}"/>
</Border>
</Grid>

* This source code was highlighted with Source Code Highlighter.

Не знаю как вам, но мне кажется, что для такого количества «текста» он делает очень много. Если вы сохраните этот код и откроете его в XAMLPad(можно и просто при помощи IE), вы увидите погоду в моём городе с gismeteo.ru. Как вы можете заметить при этом не написано ни строчки компилируемого или скриптового кода. Попробую объяснить, что и как.
Ну вначале всё ясно, создали мы грид(правда он не совсем вначале), в который будем помещать наши визуальные элементы. Поместили в него листбокс а вот дальше начинается магия. В лист бокс как бы надо поместить что-то. Вот это что-то, надо где-то взять. Погоду естественно можем взять с rss ленты gismeteo. Для этого создадим в ресурсах грида XmlDataProvider:

 <XmlDataProvider x:Key="rss" 
   Source="http://informer.gismeteo.ua/rss/99882.xml"
   XPath="/rss/channel"/>

* This source code was highlighted with Source Code Highlighter.


натравим его на нужную ленту, и укажем путь к элементу, который мы хотим представить в виде данных. В данном случае это rss лента погоды в моём городе. После этого заглянем в исходник rss ленты и увидим, что там данные о погоде представлены в виде набора элементов <item>. Вот и попробуем вставить эти данные в листбокс:

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ItemsSource="{Binding Source={StaticResource rss}, XPath=item}"/>


* This source code was highlighted with Source Code Highlighter.


указав в качестве источника элементов байндинг на наш XmlDataProvider и задав для выборки тег item. Смотрим что получилось — О!.. Мы уже получили в нашем листбоксе, содержимое элементов <item>. Теперь, хотелось бы увидеть их в удобочитаемом виде. Нет ничего проще. Нам всего лишь нужно создать DataTemplate для типа данных item:

<DataTemplate DataType="item">
   <StackPanel>
   <TextBlock Text="{Binding XPath=title}"/>
    <TextBlock TextWrapping="Wrap" Width="360"    Text="{Binding XPath=description}"/>
   <Image Margin="15,15,0,0"   
            Stretch="None" 
            HorizontalAlignment="Left"    
            Source="{Binding XPath=enclosure/@url}" />
    </StackPanel>
    </DataTemplate>

* This source code was highlighted with Source Code Highlighter.


Тут мы создали визуальные элементы которые будут отображать содержимое элемента <itеm> и при помощи байндингов и запросов XPath сопоставили им соответствующие теги элемента <item>. Для этого мы создали контейнер StackPanel, и в него последовательно сложили три вещи — тектовый блок отображающий титул погодного элемента, тектовый блок с детальным описанием погоды, и картинку, соответвующюю нашему прогнозу. Всё, наслаждаемся прогнозом погоды в моём(вашем) городе :)

Если описать это русским языком — мы декларативно описали три вещи
1. Источник данных
2. Объект, для отображения этих данных.
3. То как, эти данные будут выглядеть.
Самый важный пункт из этих трёх, как мне кажется — третий. Вся его важность заключается в том, что мы не писали никаких алгоритмов, ифов, форов, свитчей итд, для того чтобы преобразовать внешний вид наших данных в удобоваримый для пользователя. Мы просто рассказали, как мы хотим их видеть.

UPD. В комментариях подсказывают что в IE не работает:( я делал этот файлик давно, и тогда в IE всё открывалось нормально, по всей видимости дело в настройках безопастности, с наскоку я не нашёл:( Если вам просто интересен результат — в комментариях приведен скриншот, если же хотите поиграть с кодом то лучше всего использовать www.kaxaml.com.
Теги:
Хабы:
Всего голосов 40: ↑27 и ↓13+14
Комментарии16

Публикации

Ближайшие события