<?xml version="1.0" encoding="UTF-8"?><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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>UNi ... De PHP à .NET &#187; MVVM</title>
	<atom:link href="https://blog.developpez.com/uni-fr/pcategory/net-3-x-net-4-x/mvvm/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/uni-fr</link>
	<description></description>
	<lastBuildDate>Wed, 07 May 2014 13:59:08 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>WPF &amp; MVVM &#8211; Astuce n°1 &#8211; TreeView et SelectedItem</title>
		<link>https://blog.developpez.com/uni-fr/p10698/net-3-x-net-4-x/wpf_aamp_mvvm_astuce_nd1_treeview_et_sel</link>
		<comments>https://blog.developpez.com/uni-fr/p10698/net-3-x-net-4-x/wpf_aamp_mvvm_astuce_nd1_treeview_et_sel#comments</comments>
		<pubDate>Mon, 06 Feb 2012 09:54:10 +0000</pubDate>
		<dc:creator><![CDATA[UNi[FR]]]></dc:creator>
				<category><![CDATA[.NET 3.x & .NET 4.x]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[XAML]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Après un moment sans développer en .NET, je viens de découvrir le pattern MVVM (Model &#8211; View &#8211; ViewModel) qui est vraiment bien pour décomposer son code. Je ne rentrerai pas dans le détail de ce pattern, pour ça je vous renvoie vers l&#8217;excellent livre de Thomas Lebrun et Jonathan Antoine : &#171;&#160;MVVM, un pattern pour les gouverner tous&#160;&#187; http://www.digitbooks.fr/catalogue/mvvm-antoine-lebrun.html Qui dis nouvelle méthodologie, dis nouvelle problématiques. La première que j&#8217;ai rencontré est avec le [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Après un moment sans développer en .NET, je viens de découvrir le pattern MVVM (Model &#8211; View &#8211; ViewModel) qui est vraiment bien pour décomposer son code. Je ne rentrerai pas dans le détail de ce pattern, pour ça je vous renvoie vers l&rsquo;excellent livre de Thomas Lebrun et Jonathan Antoine : &laquo;&nbsp;MVVM, un pattern pour les gouverner tous&nbsp;&raquo; <a href="http://www.digitbooks.fr/catalogue/mvvm-antoine-lebrun.html">http://www.digitbooks.fr/catalogue/mvvm-antoine-lebrun.html</a></p>
<p>Qui dis nouvelle méthodologie, dis nouvelle problématiques. La première que j&rsquo;ai rencontré est avec le composant Treeview et l&rsquo;impossibilité de binder le SelectedItem.<br />
Concernant l&rsquo;implémentation du Treeview en mode MVVM, l&rsquo;article de Josh Smith est particuliérement intéressant : <a href="http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode">http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode</a></p>
<p>Le code suivant ne compile donc pas :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;TreeView Grid.Column=&quot;0&quot; ItemsSource=&quot;{Binding CategoryFirstLevel}&quot; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SelectedItem=&quot;{Binding SelectedCategory, Mode=TwoWay}&quot; /&gt;</div></div>
<p>Parmi les solutions existantes pour résoudre ce problème, la plus rapide de mon point de vue et de créer un nouveau composant &laquo;&nbsp;ExtendedTreeView&nbsp;&raquo; qui hérite du composant Treeview dans lequel on définit une nouvelle propriété SelectedItem_.</p>
<p>Ce qui nous donne :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; public class ExtendedTreeView : TreeView <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; public ExtendedTreeView() <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : base() <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.SelectedItemChanged += new RoutedPropertyChangedEventHandler&lt;object&gt;(___ICH); <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; void ___ICH(object sender, RoutedPropertyChangedEventArgs&lt;object&gt; e) <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (SelectedItem != null) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SetValue(SelectedItem_Property, SelectedItem); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; public object SelectedItem_ <br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (object)GetValue(SelectedItem_Property); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; set <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SetValue(SelectedItem_Property, value); <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; } <br />
&nbsp; &nbsp; &nbsp; &nbsp; public static readonly DependencyProperty SelectedItem_Property = DependencyProperty.Register(&quot;SelectedItem_&quot;, typeof(object), typeof(ExtendedTreeView), new UIPropertyMetadata(null)); <br />
&nbsp; &nbsp; }</div></div>
<p>Il suffit ensuite dans votre code XAML de faire appel à ce nouveau composant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;ctrl:ExtendedTreeView Grid.Column=&quot;0&quot; ItemsSource=&quot;{Binding CategoryFirstLevel}&quot; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SelectedItem_=&quot;{Binding SelectedCategory, Mode=TwoWay}&quot; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&gt;</div></div>
<p><strong>ctrl:</strong> correspondant à l&rsquo;espace de nom dans lequel mon composant est déclarer.</p>
<p>Vous voilà donc avec un Treeview pour lequel i lest très facile de récupérer le SelectedItem.</p>
<p>A bientôt pour d&rsquo;autres astuces !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
