|
Программирование >> Расширенный wf
<TextBlock Width= 190 Height= 50 Margin= 5 TextWrapping= Wrap Text= {Binding Path=Authors, Converter={StaticResource stringArrayConverter}, ConverterParameter=, } Grid.Row= 3 Grid.Column= 1 /> На рис. 35.9 можно видеть подробную информацию о книге, включая список авторов. Рис. 35.9. Просмотр подробной информации о книге Динамическое добавление элементов в список Что, если элементы в список будут добавляться динамически? Элемент WPF должен быть извещен о добавлении в список новых элементов. В коде XAML приложения WPF элемент Button добавляется внутри StackPanel. Событию Click назначается обработчик - метод OnAddBook(): <!-- ... -- > <DockPanel> <StackPanel Orientation= Horizontal DockPanel.Dock= Bottom Height= 60 > <Button Click= addBookButton Click Name= addBookButton Margin= 5 Width= 80 Height= 40 >Add Book</Button> </StackPanel> <Grid > <!-- В методе addBookButton Click(), который реализует код обработчика события для addBookButton, новый объект Book добавляется к списку. Если вы протестируете приложение с BookFactory, в том виде, как оно у нас реализовано сейчас, то никакого уведомления о добавлении нового объекта в список элементы WPF не получат. void addBookButton Click(object sender, RoutedEventArgs e) factory.AddBook(new Book( .NET 2.0 Wrox Box , Wrox Press , 978-0-470-04840-5 )); Объект, присвоенный DataContext, должен реализовывать интерфейс INotify CollectionChanged. Этот интерфейс определяет событие CollectionChanged, используемое приложением WPF. Вместо реализации этого интерфейса в собственном классе коллекции вы можете определить обобщенный класс коллекции ObservableCollection<T> из пространства имен System.Collections.ObjectModel в сборке WindowsBase. После этого при добавлении нового элемента в коллекцию этот новый элемент будет немедленно отображен в ListBox. public class BookFactory private ObservableCollection<Book> books = new ObservableCollection<Book>(); ... -- > public void AddBook(Book b) books.Add(b); public IEnumerable<Book> GetBooks() return books; Шаблоны данных В этой главе вы уже видели, как элементы управления могут быть настроены посредством шаблонов. Также вы уже определяли шаблон для типа данных, например, для класса Book. Независимо от того, где этот класс используется, шаблон определит для него вид по умолчанию. В нашем примере DataTemplate определен внутри ресурсов Window. Свойство DataType ссылается на класс Book из пространства имен Wrox.ProCSharp.WPF. Шаблон определяет рамку с двумя элементами-метками, находящимися в панели StackPanel. С помощью элемента ListBox вы можете видеть, что нет ссылок ни на какой шаблон. Единственное свойство, определенное ListBox - это ItemsSource со значением для стандартного расширения разметки Binding. Поскольку DataTemplate не определяет ключа, он используется всеми списками, содержащими объекты Book. На рис. 35.10 показан вывод приложения с шаблоном данных. Рис. 35.10. Пример использования шаблона данных <Window x:Class= Wrox.ProCSharp.WPF.DataTemplateDemo 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= Data Binding Height= 300 Width= 300 > <Window.Resources> <DataTemplate DataType= {x:Type src:Book} > <Border BorderBrush= Blue BorderThickness= Margin= 10 Padding= 15 > <StackPanel> {Binding Path=Title} <Label Content= <Label Content= {Binding Path=Publisher} /> </StackPanel> </Border> </DataTemplate> </Window.Resources> <Grid> <ListBox ItemsSource= {Binding} /> </Grid> </Window> 2 Background= LightBlue /> В случае если вы хотите использовать другой шаблон данных с тем же типом данных, то можете создать селектор шаблона данных. Селектор шаблона данных реализован как класс-наследник DataTemplateSelector. Приведем селектор шаблона данных, реализованный выбором шаблона в зависимости от издателя. Шаблон определен внутри ресурсов Window. Один шаблон мо- жет быть доступен по ключевому имени WroxBookTemplate, а другой - по имени WileyBookTemplate: <DataTemplate x:Key= WroxBookTemplate DataType= {x:Type src:Book} > <Border BorderBrush= Blue BorderThickness= 2 Background= LightBlue Margin= 10 Padding= 15 > <StackPanel> <Label Content= {Binding Path=Title} /> <Label Content= {Binding Path=Publisher} /> </StackPanel> </Border> </DataTemplate> <DataTemplate x:Key= WileyBookTemplate DataType= {x:Type src:Book} > <Border BorderBrush= Yellow BorderThickness= 2 Background= LightGreen Margin= 10 Padding= 15 > <StackPanel> <Label Content= {Binding Path=Title} /> <Label Content= {Binding Path=Publisher} /> </StackPanel> </Border> </DataTemplate> Для выбора шаблона в классе BookDataTemplateSelector переопределяется метод SelectTemplate базового класса DataTemplateSelector. Реализация выбирает шаблон в зависимости от свойства Publisher класса Book. using System.Windows; using System.Windows.Controls; namespace Wrox.ProCSharp.WPF public class BookDataTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) if (item != null & & item is Book) { Window window = Application.Current.MainWindow; Book book = item as Book; switch (book.Publisher) case Wrox Press : return window.FindResource( WroxBookTemplate ) as DataTemplate; case Wiley : return window.FindResource( WileyBookTemplate ) as DataTemplate; default: return window.FindResource( BookTemplate ) as DataTemplate; return null; Для доступа к классу BookDataTemplateSelector из кода XAML класс определен внутри ресурсов Window: <src:BookDataTemplateSelector x:Key= bookTemplateSelector />
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |