WPF 4.0. Что нового? Часть 4
Четвертая часть из серии нововведений WPF 4.0 (Предыдущие записи: 1, 2, 3). Думал, что это будет заключительная, но все же откопал еще несколько вкусностей на следующую часть. В этой же серии в основном будет информация о нововведениях связанных с XAML разметкой и биндингом. XAML Built in Types В XAML добавилась возможность использовать стандартные типы .NET в разметке без указания лишних namespace, для чего это стало нужно видно в нижеописанных возможностях. Если раньше для описания в XAML объекта типа string приходилось писать: <s:String xmlns:s="clr-namespace:System;assembly=mscorlib"> Foo </s:String> Теперь же <x:String > Foo </s:String> Все типы перечислены тут - Xaml 2009 Features: Built in Types. Поддержка Generics Этого давно не хватало, а именно с выпуска первого WPF. Как часто хотелось объявить в XAML ObservableCollection с типом вроде Person, а для этого нам приходилось создавать новый тип и наследовать его от коллекции, либо инкапсулировать ее: class PersonCollection:ObservableCollection<Person>{} и уже этот новый класс объявлять в ресурсах: <l:PersonCollection> <Person Name="Tom" /> </l:PersonCollection> Теперь же этого можно избежать, теперь в XAML можно объявлять и инициализировать generics следующим образом: <ObservableCollectionx:TypeArguments='local:Person' xmlns='clr-namespace:System.Collections.ObjectModel;assembly=System' > <local:Person Name='Tom' Age='21' /> </ObservableCollection> Интересные примеры с объявлением Dictionary<Key,Value> можно посмотреть здесь - XAML 2009 Features: Generics Support. FactoryMethod\Arguments Еще одна возможность, которую хотели уже давно. Возможность использовать методы для инициализации объектов, а так же конструкторы, которые принимают параметры. Для того чтобы создать объект такого типа: public classPerson { public Person (string name, int age) { Name = name; Age = age; } public string Name {get;set;} public int Age {get;set;} } В XAML теперь можно написать <local:Person> <x:Arguments> <x:String>Tom</x:String> <x:Int32>21</x:Int32> </x:Arguments> </local:Person> Более того для создания объекта теперь можно использовать FactoryMethod, самый простой пример – это Guid.NewGuid(): <p:Guid x:FactoryMethod='NewGuid'/> Или более сложный пример с передачей параметров: <coll:List x:Key='list' x:TypeArguments='x:String' x:FactoryMethod='local:Factory.CreateStringList'> <x:Arguments> <x:String>Mickey,Donald</x:String> </x:Arguments> </coll:List> Named Object References Тут все просто, такой биндинг: <Label Target='{Binding ElementName=firstNameBox}' >_Target</Label> <TextBox Name='firstNameBox'>Uses Binding</TextBox> Теперь можно записать при помощи x:Reference <Label Target= '{x:Reference secondNameBox}'>_Second Target</Label> Или даже так: <Label Target= 'thirdNameBox' >_Third Target</Label> Binding to Dynamic Objects .NET 4 приходит вместе с dynamic, потому и в WPF добавили возможность биндить к свойствам dynamic объектов. Если мы установим такие свойства у объекта: dynamic dynamicObj = BindPanel.DataContext ; dynamicObj.A = "Simple Binding"; dynamicObj.B = newDynamicObjectClass(); dynamicObj.B.C = "Nested Prop Binding"; dynamicObj.AddItem("item 0"); dynamicObj[0] = "Indexer Binding"; То мы запросто можем установить такой биндинг: <StackPanel Name="BindPanel" DataContext="{StaticResource MyDynamicObject}"> <TextBox Text="{Binding Path=A}"/> <TextBlock Text="{Binding Path=B.C}" /> <TextBox Text="{Binding Path=[(x:Int32)0]}"/> </StackPanel> Эта возможность тоже даст пищу для размышлений. Теперь можно придумать о быстрой реализации биндинга к DataSet или XMLDocument. Автор: Денис Гладких |