|
Программирование >> Расширенный wf
void bookButton Click(object sender, RoutedEventArgs e) string message = book1.Title; string caption = book1.Isbn; MessageBox.Show(message, caption); Объектный поставщик данных Вместо определения объекта в отделенном коде вы можете определить его в XAML. Чтобы обеспечить такую возможность, вам следует обратиться к пространству имен посредством объявления пространства имен в корневом элементе XML. XML-атрибут xmlns:src=/img-2/ clr-namespace:Wrox.ProCsharp.WPF присваивает пространству имен .NET Wrox.ProCSharp.WPF XML-псевдоним src. Один объект класса Book теперь определен в элементе Book внутри ресурсов Window. Присваивая значения XML-атрибутам Title и Publisher, вы устанавливаете значения свойств класса Book. Установка x:Key= theBook определяет идентификатор ресурса, так что вы можете ссылаться на объект book. В элементе TextBox теперь определен Source с расширением привязки Binding для ссылки на ресурс theBook. Расширения XAML разметки можно комбинировать. В следующем примере расширение разметки StaticResource используется для сс1лки на ресурс - книгу и содержится внутри расширения разметки 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= Object Binding Sample Height= 300 Width= 340 > <Window.Resources> <src:Book x:Key= theBook Title= Professional C# 2008 Publisher= Wrox Press /> </Window.Resources> <! - ... -> <TextBox Margin= 5 Height= 30 Grid.Column= 1 Grid.Row= 0 Text= {Binding Source={StaticResource theBook}, Path=Title} /> <!-- ... Если пространство имен .NET, на которое нужно сослаться, находится в другой сборке, вы также должны добавить имя сборки в объявление XML: xmlns:system= clr-namespace:System;assembly=mscorlib . Вместо определения экземпляра объекта непосредственно внутри кода XAML, вы можете также определить поставщика объектных данных, ссылающегося на класс для вызова метода. Чтобы использовать ObjectDataProvider, лучше всего создать класс-фабрику, который возвращает объект для отображения, как показано на примере класса BookFactory: public class BookFactory private List<Book> books = new List<Book>(); public BookFactory() books.Add(new Book( Professional C# with 2008 , Wrox Press , 978-0470191378 )); public Book GetTheBook() return books[0]; Элемент ObjectDataProvider может быть определен в разделе ресурсов. XML-атрибут ObjectType определяет имя класса; в MethodName вы специфицируете имя метода, который вызывается для получения объекта - книги: <Window.Resources> <ObjectDataProvider ObjectType= src:BookFactory MethodName= GetTheBook x:Key= theBook > </ObjectDataProvider> </Window.Resources> Свойства, которые вы можете специфицировать в классе ObjectDataProvider, перечислены в табл. 35.3. Таблица 35.3. Свойства класса ObjectDataProvider Свойство Описание ObjectType Свойство ObjectType определяет тип, экземпляр которого следует создать. ConstructorParameters Используя коллекцию ConstructorParameters, вы можете добавлять параметры в класс для создания экземпляра. MethodName Свойство MethodName определяет имя метода, вызываемого постав- щиком объектных данных. MethodParameters С помощью свойства MethodParameters вы можете присвоить пара- метры метода, определенного свойством MethodName. ObjectInstance С помощью свойства ObjectInstance вы можете получать и уста- навливать объект, используемый классом ObjectDataProvider. Например, вы можете программно присвоить существующий объект вместо определения ObjectType, так что экземпляр объекта будет создан посредством ObjectDataProvider. С помощью свойства Data вы можете обращаться к лежащему в основе объекту, используемому для привязки данных. Если определен MethodName, то через свойство Data вы можете обратиться к объекту, возвращенному этим методом. Data Привязка списка Привязка списка выполняется чаще, чем привязка простых объектов. Но привязка списка очень похожа на привязку простого объекта. Вы можете назначить полный список DataContext в отделенном коде или же использовать ObjectDataProvider, обращающийся к фабрике объектов и возвращающий список. С помощью элементов, поддерживающих привязку к списку (например, ListBox), привязывается сразу весь список. Посредством элементов, которые поддерживают привязку только одного объекта (например, TextBox), привязывается только один текущий элемент из списка. Усовершенствуем класс BookFactory, чтобы он мог возвращать сразу список объектов - книг. public class BookFactory private List<Book> books = new List<Book>(); public BookFactory() books.Add(new Book( Professional C# 2008 , Wrox Press , 978-0470191378 , Christian Nagel , Bill Evjen , Jay Glynn , Karli Watson , Morgan Skinner )); books.Add(new Book( Professional C# 2005 with .NET 3.0 , Wrox Press , 978-0-7645-7534-1 , Christian Nagel , Bill Evjen , Jay Glynn , Karli Watson , Morgan Skinner , Allen Jones )); books.Add(new Book( Professional C# 2005 , Wrox Press , 978-0-7645-7534-1 , Christian Nagel , Bill Evjen , Jay Glynn , Karli Watson , Morgan Skinner , Allen Jones )); books.Add(new Book( Beginning Visual C# , Wrox Press , 978-0-7645-4382-1 , Karli Watson , David Espinosa , Zach Greenvoss , Jacob Hammer Pedersen , Christian Nagel , John D. Reid , Matthew Reynolds , Morgan Skinner , Eric White )); books.Add(new Book( ASP.NET Professional Secrets , Wiley , 978-0-7645-2628-2 , Bill Evjen , Thiru Thangarathinam , Bill Hatfield , Doug Seven , S. Srinivasa Sivakumar , Dave Wanta , Jason T. Roff )); books.Add(new Book( Design and Analysis of Distributed Algorithms , Wiley , 978-0-471-71997-7 , Nicolo Santoro )); public IEnumerable<Book> GetBooks() return books; В конструкторе отделенного кода WPF для класса Window1 создается экземпляр BookFactory и вызывается метод GetBooks() для присвоения массива Book с DataContext экземпляра Winbdow1: public partial class Window1 : System.Windows.Window private BookFactory factory = new BookFactory(); public Window1() InitializeComponent(); this.DataContext = factory.GetBooks(); В XAML вам нужен просто элемент управления, поддерживающий списки, такой как ListBox, и привязка свойства ItemsSource, как показано ниже: <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 Title= List Binding Sample Height= 300 Width= 518 > <DockPanel> <Grid > <Grid.ColumnDefinitions> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <ListBox HorizontalAlignment= Left Margin= 5 Grid.RowSpan= 4 Grid.Row= 0 Grid.Column= 0 Name= booksList ItemsSource= {Binding} /> </Grid> </DockPanel> </Window>
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |