Denis Gladkikh

outcoldman

My personal blog about software development

  • 02 Mar 2010
  • .NET, .NET 4.0, WPF, WPF 4, Visual Studio 2010
  • 0 comments

Четвертая часть из серии нововведений 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.

Comments