<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>ixamltyperesolver &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/ixamltyperesolver/</link>
	<description>Feed of posts on WordPress.com tagged "ixamltyperesolver"</description>
	<pubDate>Wed, 22 May 2013 18:37:22 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Type Markup Extension]]></title>
<link>http://zamjad.wordpress.com/2011/06/15/type-markup-extension/</link>
<pubDate>Wed, 15 Jun 2011 15:21:40 +0000</pubDate>
<dc:creator>Zeeshan Amjad</dc:creator>
<guid>http://zamjad.wordpress.com/2011/06/15/type-markup-extension/</guid>
<description><![CDATA[To write a markup extension, at minimum we need to do two things. First inherit our class from Marku]]></description>
<content:encoded><![CDATA[<p>To write a markup extension, at minimum we need to do two things. First inherit our class from MarkupExtension class, and second override ProvideValue method of the MarkupExtension class. ProvideValue method takes only one parameter that is interface of IServiceProvider. This interface has only one method to get the available services. Here is a class diagram of this interface. </p>
<p><a href="http://zamjad.files.wordpress.com/2011/06/iserviceprovider.gif"><img style="background-image:none;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0;border-width:0;" title="IServiceProvider" border="0" alt="IServiceProvider" src="http://zamjad.files.wordpress.com/2011/06/iserviceprovider_thumb.gif?w=535&#038;h=97" width="535" height="97" /></a></p>
<p>To get the detail information about the type we need to get the IXamlTypeResolver service requested by ISserviceProvide interface. Its code is quite simple. </p>
<div style="width:442px;display:block;float:none;margin-left:auto;margin-right:auto;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8e6f74cd-83f6-4dcf-9b84-afaa94d0be52" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;">Code Snippet</div>
<div style="background-color:#ffffff;overflow:auto;padding:2px 5px;"> service = serviceProvider.GetService(<span style="color:#0000ff;">typeof</span>(<span style="color:#2b91af;">IXamlTypeResolver</span>)) <span style="color:#0000ff;">as</span> <span style="color:#2b91af;">IXamlTypeResolver</span>;</div>
</p></div>
</p></div>
<p>&#160;</p>
<p>IXamlTypeResolver interface also contain only one method. Here is a class diagram of IXamltypeResolver interface. </p>
<p><a href="http://zamjad.files.wordpress.com/2011/06/ixamltyperesolver.gif"><img style="background-image:none;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0;border-width:0;" title="IXamlTypeResolver" border="0" alt="IXamlTypeResolver" src="http://zamjad.files.wordpress.com/2011/06/ixamltyperesolver_thumb.gif?w=578&#038;h=97" width="578" height="97" /></a></p>
<p>&#160;</p>
<p>We created one property in our markup extension and passed the requested type in that property. We perform one additional check that if the given value is Enum type then display its value, otherwise display all the members of given type. For Enum type, we added one check to display the value only if IsLiteral property is set to true. Here is a piece of code to do this. </p>
<div style="width:496px;display:block;float:none;margin-left:auto;margin-right:auto;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7b355b7b-bed2-4bec-a6c5-dd9413578978" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;">Code Snippet</div>
<div style="background-color:#ffffff;max-height:500px;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#2b91af;">Type</span> type = service.Resolve(TypeName);</p>
<p> <span style="color:#0000ff;">if</span> (type.BaseType == <span style="color:#0000ff;">typeof</span>(<span style="color:#2b91af;">Enum</span>))<br /> {<br />     <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">from</span> field <span style="color:#0000ff;">in</span> type.GetFields()<br />             <span style="color:#0000ff;">where</span> field.IsLiteral == <span style="color:#0000ff;">true</span><br />             <span style="color:#0000ff;">select</span> field.GetValue(<span style="color:#0000ff;">null</span>);<br /> }<br /> <span style="color:#0000ff;">else</span><br /> {<br />     <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">from</span> member <span style="color:#0000ff;">in</span> type.GetMembers()<br />             <span style="color:#0000ff;">select</span> member.Name;<br /> }</div>
</p></div>
</p></div>
<p>&#160;</p>
<p>Here is complete code of MyTypeMarkupExtension. </p>
<div style="width:496px;display:block;float:none;margin-left:auto;margin-right:auto;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fc4373cb-ab49-4adc-9832-e7125d1e1980" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;">Code Snippet</div>
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> <span style="color:#2b91af;">MyTypeMarkupExtension</span> : <span style="color:#2b91af;">MarkupExtension</span><br /> {<br />     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> TypeName <br />     { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }</p>
<p>     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">override</span> <span style="color:#0000ff;">object</span> ProvideValue(<span style="color:#2b91af;">IServiceProvider</span> serviceProvider)<br />     {<br />         <span style="color:#2b91af;">IXamlTypeResolver</span> service = serviceProvider.GetService(<span style="color:#0000ff;">typeof</span>(<span style="color:#2b91af;">IXamlTypeResolver</span>)) <span style="color:#0000ff;">as</span> <span style="color:#2b91af;">IXamlTypeResolver</span>;</p>
<p>         <span style="color:#0000ff;">if</span> (service != <span style="color:#0000ff;">null</span>)<br />         {<br />             <span style="color:#2b91af;">Type</span> type = service.Resolve(TypeName);</p>
<p>             <span style="color:#0000ff;">if</span> (type.BaseType == <span style="color:#0000ff;">typeof</span>(<span style="color:#2b91af;">Enum</span>))<br />             {<br />                 <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">from</span> field <span style="color:#0000ff;">in</span> type.GetFields()<br />                         <span style="color:#0000ff;">where</span> field.IsLiteral == <span style="color:#0000ff;">true</span><br />                         <span style="color:#0000ff;">select</span> field.GetValue(<span style="color:#0000ff;">null</span>);<br />             }<br />             <span style="color:#0000ff;">else</span><br />             {<br />                 <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">from</span> member <span style="color:#0000ff;">in</span> type.GetMembers()<br />                         <span style="color:#0000ff;">select</span> member.Name;<br />             }<br />         }<br />         <span style="color:#0000ff;">else</span><br />             <span style="color:#0000ff;">return</span> <span style="color:#a31515;">&#34;&#34;</span>;<br />     }<br /> }</div>
</p></div>
</p></div>
<p>&#160;</p>
<p>Now we created one Enum type and one class type to use this markup extension. Here is a code of it. </p>
<div style="width:496px;display:block;float:none;margin-left:auto;margin-right:auto;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:65735ed9-e578-4f10-8a50-ac555b525971" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;">Code Snippet</div>
<div style="background-color:#ffffff;max-height:500px;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">enum</span> <span style="color:#2b91af;">Directions</span><br /> {<br />     East = 100, West, North, South<br /> }</p>
<p> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> <span style="color:#2b91af;">MyClass</span><br /> {<br />     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> x { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }<br />     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> y { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }<br />     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> z { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }<br /> }</div>
</p></div>
</p></div>
<p align="center">&#160;</p>
<p>Here is XAML code to use this</p>
<div style="width:332px;display:block;float:none;margin-left:auto;margin-right:auto;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ff1a9656-9c1b-4541-a780-93609751006e" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;">Code Snippet</div>
<div style="background-color:#ffffff;overflow:auto;padding:2px 5px;"><span style="color:#a31515;"></span><span style="color:#0000ff;">&#60;</span><span style="color:#a31515;">ListBox</span><span style="color:#ff0000;"> Margin</span><span style="color:#0000ff;">=&#34;5&#34;</span><span style="color:#ff0000;"> ItemsSource</span><span style="color:#0000ff;">=&#34;{</span><span style="color:#a31515;">local</span><span style="color:#0000ff;">:</span><span style="color:#a31515;">MyTypeMarkup</span><span style="color:#ff0000;"> TypeName</span><span style="color:#0000ff;">=local:Directions}&#34;/&#62;</span><br /> <span style="color:#a31515;"></span><span style="color:#0000ff;">&#60;</span><span style="color:#a31515;">ListBox</span><span style="color:#ff0000;"> Margin</span><span style="color:#0000ff;">=&#34;5&#34;</span><span style="color:#ff0000;"> ItemsSource</span><span style="color:#0000ff;">=&#34;{</span><span style="color:#a31515;">local</span><span style="color:#0000ff;">:</span><span style="color:#a31515;">MyTypeMarkup</span><span style="color:#ff0000;"> TypeName</span><span style="color:#0000ff;">=local:MyClass}&#34;/&#62;</span></div>
</p></div>
</p></div>
<p>&#160;</p>
<p>Here is complete C# code of the program. </p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5c5bba37-9bc2-4a6d-8dab-43c371ed221e" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;">Code Snippet</div>
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">using</span> System;<br /> <span style="color:#0000ff;">using</span> System.Linq;<br /> <span style="color:#0000ff;">using</span> System.Windows;<br /> <span style="color:#0000ff;">using</span> System.Windows.Markup;</p>
<p> <span style="color:#0000ff;">namespace</span> MarkupExtensionSample<br /> {<br />     <span style="color:#808080;">///</span><span style="color:#008000;"> </span><span style="color:#808080;">&#60;summary&#62;</span><br />     <span style="color:#808080;">///</span><span style="color:#008000;"> Interaction logic for MainWindow.xaml</span><br />     <span style="color:#808080;">///</span><span style="color:#008000;"> </span><span style="color:#808080;">&#60;/summary&#62;</span><br />     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">partial</span> <span style="color:#0000ff;">class</span> <span style="color:#2b91af;">MainWindow</span> : <span style="color:#2b91af;">Window</span><br />     {<br />         <span style="color:#0000ff;">public</span> MainWindow()<br />         {<br />             InitializeComponent();            <br />         }<br />     }</p>
<p>     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">enum</span> <span style="color:#2b91af;">Directions</span><br />     {<br />         East = 100, West, North, South<br />     }</p>
<p>     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> <span style="color:#2b91af;">MyClass</span><br />     {<br />         <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> x { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }<br />         <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> y { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }<br />         <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">int</span> z { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }<br />     }</p>
<p>     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span> <span style="color:#2b91af;">MyTypeMarkupExtension</span> : <span style="color:#2b91af;">MarkupExtension</span><br />     {<br />         <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">string</span> TypeName <br />         { <span style="color:#0000ff;">get</span>; <span style="color:#0000ff;">set</span>; }</p>
<p>         <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">override</span> <span style="color:#0000ff;">object</span> ProvideValue(<span style="color:#2b91af;">IServiceProvider</span> serviceProvider)<br />         {<br />             <span style="color:#2b91af;">IXamlTypeResolver</span> service = serviceProvider.GetService(<span style="color:#0000ff;">typeof</span>(<span style="color:#2b91af;">IXamlTypeResolver</span>)) <span style="color:#0000ff;">as</span> <span style="color:#2b91af;">IXamlTypeResolver</span>;</p>
<p>             <span style="color:#0000ff;">if</span> (service != <span style="color:#0000ff;">null</span>)<br />             {<br />                 <span style="color:#2b91af;">Type</span> type = service.Resolve(TypeName);</p>
<p>                 <span style="color:#0000ff;">if</span> (type.BaseType == <span style="color:#0000ff;">typeof</span>(<span style="color:#2b91af;">Enum</span>))<br />                 {<br />                     <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">from</span> field <span style="color:#0000ff;">in</span> type.GetFields()<br />                             <span style="color:#0000ff;">where</span> field.IsLiteral == <span style="color:#0000ff;">true</span><br />                             <span style="color:#0000ff;">select</span> field.GetValue(<span style="color:#0000ff;">null</span>);<br />                 }<br />                 <span style="color:#0000ff;">else</span><br />                 {<br />                     <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">from</span> member <span style="color:#0000ff;">in</span> type.GetMembers()<br />                             <span style="color:#0000ff;">select</span> member.Name;<br />                 }<br />             }<br />             <span style="color:#0000ff;">else</span><br />                 <span style="color:#0000ff;">return</span> <span style="color:#a31515;">&#34;&#34;</span>;<br />         }<br />     }<br /> }</div>
</p></div>
</p></div>
<p>&#160;</p>
<p>And here is complete XAML code of the program. </p>
<div style="display:inline;float:none;margin:0;padding:0;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2c21c3a7-7940-401d-a12e-9014faa532c1" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;">Code Snippet</div>
<div style="background-color:#ffffff;overflow:auto;white-space:nowrap;padding:2px 5px;"><span style="color:#0000ff;">&#60;</span><span style="color:#a31515;">Window</span><span style="color:#ff0000;"> x</span><span style="color:#0000ff;">:</span><span style="color:#ff0000;">Class</span><span style="color:#0000ff;">=&#34;MarkupExtensionSample.MainWindow&#34;</span><br />        <span style="color:#ff0000;"> xmlns</span><span style="color:#0000ff;">=&#34;<a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation&#038;#34" rel="nofollow">http://schemas.microsoft.com/winfx/2006/xaml/presentation&#038;#34</a>;</span><br />        <span style="color:#ff0000;"> xmlns</span><span style="color:#0000ff;">:</span><span style="color:#ff0000;">x</span><span style="color:#0000ff;">=&#34;<a href="http://schemas.microsoft.com/winfx/2006/xaml&#038;#34" rel="nofollow">http://schemas.microsoft.com/winfx/2006/xaml&#038;#34</a>;</span><br />        <span style="color:#ff0000;"> xmlns</span><span style="color:#0000ff;">:</span><span style="color:#ff0000;">local</span><span style="color:#0000ff;">=&#34;clr-namespace:MarkupExtensionSample&#34;</span><br />        <span style="color:#ff0000;"> Title</span><span style="color:#0000ff;">=&#34;MainWindow&#34;</span><span style="color:#ff0000;"> Height</span><span style="color:#0000ff;">=&#34;400&#34;</span><span style="color:#ff0000;"> Width</span><span style="color:#0000ff;">=&#34;600&#34;&#62;</span><br />     <span style="color:#a31515;"></span><span style="color:#0000ff;">&#60;</span><span style="color:#a31515;">StackPanel</span><span style="color:#0000ff;">&#62;</span><br />         <span style="color:#a31515;"></span><span style="color:#0000ff;">&#60;</span><span style="color:#a31515;">ListBox</span><span style="color:#ff0000;"> Margin</span><span style="color:#0000ff;">=&#34;5&#34;</span><span style="color:#ff0000;"> ItemsSource</span><span style="color:#0000ff;">=&#34;{</span><span style="color:#a31515;">local</span><span style="color:#0000ff;">:</span><span style="color:#a31515;">MyTypeMarkup</span><span style="color:#ff0000;"> TypeName</span><span style="color:#0000ff;">=local:Directions}&#34;/&#62;</span><br />         <span style="color:#a31515;"></span><span style="color:#0000ff;">&#60;</span><span style="color:#a31515;">ListBox</span><span style="color:#ff0000;"> Margin</span><span style="color:#0000ff;">=&#34;5&#34;</span><span style="color:#ff0000;"> ItemsSource</span><span style="color:#0000ff;">=&#34;{</span><span style="color:#a31515;">local</span><span style="color:#0000ff;">:</span><span style="color:#a31515;">MyTypeMarkup</span><span style="color:#ff0000;"> TypeName</span><span style="color:#0000ff;">=local:MyClass}&#34;/&#62;</span><br />     <span style="color:#a31515;"></span><span style="color:#0000ff;">&#60;/</span><span style="color:#a31515;">StackPanel</span><span style="color:#0000ff;">&#62;</span><br /> <span style="color:#0000ff;">&#60;/</span><span style="color:#a31515;">Window</span><span style="color:#0000ff;">&#62;</span></div>
</p></div>
</p></div>
<p>&#160;</p>
<p>This is a output of the program. </p>
<p><a href="http://zamjad.files.wordpress.com/2011/06/mymarkupextensionoutput.gif"><img style="background-image:none;padding-left:0;padding-right:0;display:block;float:none;margin-left:auto;margin-right:auto;padding-top:0;border-width:0;" title="MyMarkupExtensionOutput" border="0" alt="MyMarkupExtensionOutput" src="http://zamjad.files.wordpress.com/2011/06/mymarkupextensionoutput_thumb.gif?w=750&#038;h=500" width="750" height="500" /></a></p>
]]></content:encoded>
</item>

</channel>
</rss>
