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.

Автор: Денис Гладких