XAML 2009 Features: Generics Support
This is part of a series on New WPF\XAML Features
XAML 2009 supports generics J .. In previous releases, if you needed to have an observableCollection for databinding you would probably have written code like
class PersonCollection:ObservableCollection<Person>{}
<l:PersonCollection>
<Person Name="Tom" />
</l:PersonCollection>
In this release, you can now write this as
<ObservableCollection x:TypeArguments='local:Person' xmlns='clr-namespace:System.Collections.ObjectModel;assembly=System' >
<local:Person Name='Tom' Age='21' />
</ObservableCollection>
…
<ListBox ItemsSource='{Binding}' DisplayMemberPath='Name'></ListBox>
Notice the use of TypeArguments to specify the collection type (Person in this case). It is used to pass the required constraints for a generic type
Lets go for some more examples. Simple Dictionary with the key\value pair being strings
<StackPanel.DataContext>
<coll:Dictionary x:TypeArguments='x:String, x:String' xmlns:coll='clr-namespace:System.Collections.Generic;assembly=mscorlib'>
<x:String x:Key='One'>1</x:String>
<x:String x:Key='Two'>2</x:String>
</coll:Dictionary>
</StackPanel.DataContext>
<ListBox ItemsSource='{Binding}' DisplayMemberPath='Key' Width='100'></ListBox>
Next we have a slightly more complicated dictionary with an object as the key\value pair. Interesting to note here is that Key
<StackPanel.DataContext>
<coll:Dictionary x:TypeArguments='p:Object, p:Object' xmlns:p='clr-namespace:System;assembly=mscorlib'>
<Point X='42' Y='3' >
<x:Key>
<Point X='100' Y='1' />
</x:Key>
</Point>
<x:Null x:Key='three' />
</coll:Dictionary>
</StackPanel.DataContext>
<ListBox ItemsSource='{Binding}' DisplayMemberPath='Value' Width='100'></ListBox>
And finally a nested dictionary sample
<StackPanel.Resources>
<coll:Dictionary x:TypeArguments='p:Object, coll:Dictionary(p:Object, p:Object)' x:Key='NestedItems'>
<coll:Dictionary x:Key='Dictionary1' x:TypeArguments='x:Object, x:Object'>
<x:String x:Key='One'>1</x:String>
<Point X='42' Y='3'>
<x:Key>
<Point X='11' Y='22' />
</x:Key>
</Point>
</coll:Dictionary>
</coll:Dictionary>
</StackPanel.Resources>
<ListBox ItemsSource='{StaticResource NestedItems}' DisplayMemberPath='Key'></ListBox>
Sample app showing the usage is attached.
Note that XAML 2009 features work only for loose XAML in WPF.