Программирование >>  Расширенный wf 

1 2 3 [ 4 ] 5 6 7 ... 15


Поскольку Window имеет массив Book, назначенный DataContext, и ListBox помещен внутрь Window, этот ListBox показывает все книги в шаблоне по умолчанию, как показано на рис. 35.6.

Для более гибкой компоновки ListBox вам придется определить шаблон, как это было описано в предыдущей главе, когда речь шла о стилизации ListBox. Шаблон ItemTemplate, содержащийся в стиле listBoxStyle, определяет DataTemplate с элементом Label. Содержимое метки привязано к Title. Шаблон элемента повторяется для каждого элемента в списке.

Элемент ListBox имеет присвоенное свойство Style. Как и ранее, ItemsSource установлен в привязку по умолчанию. На рис. 35.7 показан вывод приложения с новым стилем ListBox.

<Window.Resources>

<Style x:Key= listBoxStyle TargetType= {x:Type ListBox} > <Setter Property= ItemTemplate > <Setter.Value> <DataTemplate>

<Label Content= {Binding Title} /> </DataTemplate> </Setter.Value> </Setter> </Style>

</Window.Resources> <! - ... ->

<ListBox HorizontalAlignment= Left Margin= 5

Style= {StaticResource listBoxStyle} Grid.RowSpan= 4 ItemsSource= {Binding} />

Привязка типа ведущая-детали

Вместо простого отображения всех элементов внутри списка можно отобразить лишь детальную информацию об одном выбранном его элементе. Чтобы добиться этого, не понадобится много усилий. Вы просто определяете элементы для отображения текущего выбора. В нашем примере приложения определены три элемента Label с расширением разметки Binding, установленным в свойства Book - Title, Publisher и Isbn. В ListBox потребуется внести только одно важное изменение. По умолчанию метки просто привязываются к первому элементу в списке. За счет настройки свойства ListBox как IsSynchronizedWithCurrentItem= True выбор окна списка устанавливается в текущий элемент. На рис. 35.8 вы можете видеть результат; выбранный элемент отображается в метках раздела деталей.



Рис. 35.6. Привязка списка

Рис. 35.7. Привязка списка с применением стиля



<Window x:Class= Wrox.ProCSharp.WPF.Window1

xmlns= http: schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x= http: schemas.microsoft.com/winfx/2006/xaml Title= List Binding Sample Height= 300 Width= 518

>

<Window.Resources>

<Style x:Key= listBoxStyle TargetType= {x:Type ListBox} > <Setter Property= ItemTemplate > <Setter.Value>

<DataTemplate>

<Label Content= {Binding Title} /> </DataTemplate> </Setter.Value> </Setter> </Style>

<Style x:Key= labelStyle TargetType= {x:Type Label} > <Setter Property= Width Value= 190 /> <Setter Property= Height Value= 40 /> <Setter Property= Margin Value= 5,5,5,5 />

</Style> </Window.Resources> <DockPanel>

<Grid >

<Grid.ColumnDefinitions>

<ColumnDefinition />

<ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions>

<RowDefinition />

<RowDefinition />

<RowDefinition />

<RowDefinition /> </Grid.RowDefinitions>

<ListBox IsSynchronizedWithCurrentItem= True HorizontalAlignment= Left Margin= 5 Style= {StaticResource listBoxStyle} Grid.RowSpan= 4 ItemsSource= {Binding} />

<Label Style= {StaticResource labelStyle}

Grid.Row= 0 Grid.Column= 1 /> <Label Style= {StaticResource labelStyle}

Grid.Row= 1 Grid.Column= 1 /> <Label Style= {StaticResource labelStyle}

Grid.Row= 2 Grid.Column= 1 /> </Grid> </DockPanel> </Window>

Content= {Binding Title} Content= {Binding Publisher} Content= {Binding Isbn}


Рис. 35.8. Привязка типа ведущая-детали



Преобразование значений

Авторы книги по-прежнему отсутствуют в выводе. Если вы привяжете свойство Authors к элементу Label, будет вызван метод ToString() класса Array, который просто вернет имя типа. Одним из решений этой проблемы может быть привязка свойства Authors к ListBox. Для ListBox вы можете определить шаблон специфического представления. Другое же решение заключается в преобразовании строкового массива, возвращенного свойством Authors, в строку и использование строки для привязки.

Класс StringArrayConverter преобразует строковый массив в строку. Классы конвертеров WPF должны реализовывать интерфейс IValueConverter из пространства имен System.Windows.Data. Этот интерфейс определяет методы Convert() и ConvertBack() . У StringArrayConverter метод Convert() преобразует строковый массив из переменной value в строку с помощью метода String.Join() . Параметр separator в Join() берется из переменной parameter, полученной методом Convert() .

Подробнее о методах класса String читайте в главе 8.

public class StringArrayConverter : IValueConverter

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

string[] stringCollection = (string[])value;

string separator = (string)parameter;

return String.Join(separator, stringCollection);

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

string s = (string)value;

char separator = (char)parameter;

return s.Split(separator);

В коде XAML класс StringArrayConverter может быть объявлен как ресурс для обращения к нему из расширения разметки Binding:

<Window x:Class= Wrox.ProCSharp.WPF.Window1

xmlns= http: schemas.microsoft.com/winfx/20 06/xaml/presentation

xmlns:x= http: schemas.microsoft.com/winfx/200 6/xaml

xmlns:src=/img-2/ clr-namespace:Wrox.ProCSharp.WPF

Title= List Binding Sample Height= 300 Width= 518

>

<Window.Resources> <src:StringArrayConverter x:Key= stringArrayConverter /> <!-- ... -- >

Для многострочного вывода элемент TextBlock объявлен со свойством TextWrapping, установленным в Wrap, чтобы обеспечить возможность отображения множества авторов. В расширении разметки Binding значение Path устанавливается в Authors, которое определено как свойство, возвращающее строковый массив. Строковый массив преобразуется из ресурса stringArrayConverter, что задано свойством Converter. Метод Convert реализации конвертера принимает значение ConverterParameter , равное , , в качестве разделитель авторов.



1 2 3 [ 4 ] 5 6 7 ... 15

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика