<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>WinRT</title>
        <link>http://blogs.ugidotnet.org/compass/category/WinRT.aspx</link>
        <description>WinRT</description>
        <language>it</language>
        <copyright>Enos Recanati</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>WinRT: SemanticZoom.ZoomedOutView &amp; DataBinding</title>
            <link>http://blogs.ugidotnet.org/compass/archive/2012/12/17/winrt-semanticzoom.zoomedoutview-databinding.aspx</link>
            <description>&lt;p&gt;WinRT ci mette a disposizione un nuovo controllo SemanticZoom che permette allo sviluppatore di definire due viste della stessa collection utile per facilitare l'utente nella ricerca di elementi "raggruppati"; il tutto è illustrato chiaramente in un &lt;a href="http://code.msdn.microsoft.com/windowsapps/GroupedGridView-77c59e8e"&gt;esempio nell'SDK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nell'esempio dell'SDK, il controllo (nel caso specifico una GridView) che ospiterà la vista &lt;i&gt;ZoomedInView&lt;/i&gt; che rappresente la visualizzazione "standard" del controllo è correttamente settata nello XAML sfruttando il DataBinding; invece la &lt;b&gt;CollectionViewSource&lt;/b&gt; della vista &lt;i&gt;ZoomedOutView&lt;/i&gt; ovvero la vista pensata proprio per facilitare l'utente nella sua ricerca; viene inizializzata nel CodeBehind della pagina nel costruttore, e cercando in rete si trovano praticamente solo esempi identici a quello dell'SDK; al limite l'inizializzazione dello &lt;b&gt;ZoomedOutView&lt;/b&gt; è fatta nel metodo &lt;i&gt;OnNavigatedTo&lt;/i&gt; sempre della View.&lt;/p&gt;
&lt;p&gt;Questo approccio funziona senza problemi se i nostri dati (ed i relativi gruppi) sono conosciuti a priori; ma mostra tutti i suoi limiti nel caso sia necessario che i dati e relativo raggruppamento avvengano in un servizio esterno. In questo caso, il controllo &lt;i&gt;ZoomedOutView&lt;/i&gt; non mostra nulla in quanto nel costruttore della pagina la collection risulta ancora vuota (visto che le chiamate a servizi esterni devono essere asincrone) e quindi il controllo diventa completamente inutilizzabile per l'utente.&lt;/p&gt;
&lt;p&gt;Cercando una soluzione intelligente al problema penso che la soluzione migliore sia utilizzare un semplice converter:&lt;/p&gt;
&lt;pre style="font-family: 'Courier New', Courier, monospace;"&gt;
public class CollectionViewSourceToCollectionGroupsConverter : IValueConverter
{
	public object Convert(object value, Type targetType, object parameter, string language)
	{
		object result = null;
		
		try
		{
			var cvs = value as ICollectionView;
			
			if (cvs != null)
			{
				result = cvs.CollectionGroups;
			}
		}
		catch (Exception ex)
		{
			result = null;
		}
		
		return result;
	}
	
	public object ConvertBack(object value, Type targetType, object parameter, string language)
	{
		throw new NotImplementedException();
	}
}
&lt;/pre&gt;
&lt;p&gt;Così possiamo semplicemente specificare lo stesso &lt;i&gt;CollectionViewSource&lt;/i&gt; per entrambe le viste (&lt;i&gt;ZoomedInView&lt;/i&gt; e &lt;i&gt;ZoomedOutView&lt;/i&gt;) e sfruttare appieno il motore di DataBinding.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/compass/aggbug/101373.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Enos Recanati</dc:creator>
            <guid>http://blogs.ugidotnet.org/compass/archive/2012/12/17/winrt-semanticzoom.zoomedoutview-databinding.aspx</guid>
            <pubDate>Mon, 17 Dec 2012 15:30:55 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/compass/archive/2012/12/17/winrt-semanticzoom.zoomedoutview-databinding.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/compass/comments/commentRss/101373.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/compass/services/trackbacks/101373.aspx</trackback:ping>
        </item>
    </channel>
</rss>