WPF 4.0. Что нового? Часть 4.
- modified:
- reading: 2 minutes
Четвертая часть из серии нововведений 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 следующим образом:
<ObservableCollection x: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 class Person
{
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 = new DynamicObjectClass();
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.