Archive

Archive for avril 2011

Télécharger les vidéos des sessions du MIX11 en un click !

Si vous vous lassez de parcourir les différents liens su site du MIX11 pour télécharger les sessions qui vous intéressent alors vous allez aimer ce lien. Il s’agit d’une application Silverlight qui vous permettra de sélectionner les différentes sessions et de les télécharger dans un dossier et ainsi économiser pas mal de temps 😉

Publicités
Catégories :MIX Étiquettes :

Utiliser les modèles de données implicites en Silverlight 5

Toujours dans mon exploration des nouveautés apportées par Silverlight 5 dans sa version Béta 1, je vais parler dans ce billet du modèle de donnée implicite qui est une fonctionnalité qui manquait à Silverlight et qui était déjà intégrée dans WPF.

Un modèle de données (data template) kézako ?
Un modèle de données est un modèle qui représentera une structure de données 😉 que nous définissons à l’aide du xaml (la plupart du temps ;-)) dans les ressources de notre application en utilisant la balise DataTemplate . Par exemple nous avons une classe représentant un bien immobilier nommée BienImmobilier définie comme suit :

public class BienImmobilier
{
	public string Identifiant { get; set; }
	public string Description { get; set; }
	public string Localisation { get; set; }
	public decimal LoyerMensuel { get; set; }
	public decimal Charge { get; set; }
}

Le modèle de données qu’on va utiliser pour représenter cette classe est le suivant :

<DataTemplate x:Key="BienImmobilierTemplate">
	<Border BorderBrush="Gray" BorderThickness="1">
		<Grid Width="400" >
			<Grid.RowDefinitions>
				<RowDefinition />
				<RowDefinition />
				<RowDefinition />
				<RowDefinition />
			</Grid.RowDefinitions>
			<Grid.ColumnDefinitions>
				<ColumnDefinition Width="Auto" />
				<ColumnDefinition Width="*" />
			</Grid.ColumnDefinitions>
		
			<TextBlock FontWeight="Bold" Text="Localisation" Grid.Column="0" Grid.Row="0" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Loyer mensuel" Grid.Column="0" Grid.Row="1" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Charge" Grid.Column="0" Grid.Row="2" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Description" Grid.Column="0" Grid.Row="3" Margin="0,0,2,0" />
		
			<TextBlock Text="{Binding Path=Localisation, Mode=OneWay}" Grid.Column="1" Grid.Row="0" />
			<TextBlock Text="{Binding Path=LoyerMensuel, Mode=OneWay}" Grid.Column="1" Grid.Row="1" />
			<TextBlock Text="{Binding Path=Charge, Mode=OneWay}" Grid.Column="1" Grid.Row="2" />
			<TextBlock Text="{Binding Path=Description, Mode=OneWay}" Grid.Column="1" Grid.Row="3" TextWrapping="Wrap" />
		</Grid>
	</Border>
</DataTemplate>

Dans le code xaml ci-dessus nous avons utiliser l’attribut x:key qui permet d’attribuer une clef à notre modèle. Pour pouvoir utiliser notre modèle par exemple dans une ListBox on fera comme suit en renseignant la valeur de la proprieté ItemTemplate :

<StackPanel x:Name="LayoutRoot" Background="White" Width="420" >
	<ListBox x:Name="myListBox" 
			 ItemsSource="{Binding}" 
			 ItemTemplate="{StaticResource BienImmobilierTemplate}" />
</StackPanel>

Quand utiliser un modèle de données implicite
Jusque là pas de problème mais on est obligé de passer par la clef de notre modèle de données définie dans les ressources pour pouvoir l’utiliser dans notre ListBox. Les modèles de données implicites nous évitent de passer par la clef et bien plus. Imaginons que nous ajoutons deux nouvelles classes Maison et Appartement dérivant de notre classe BienImmobilier.

public class Maison : BienImmobilier
{
	public bool Jardin { get; set; }
}

public class Appartement : BienImmobilier
{
	public ushort Etage { get; set; }
	public bool Ascenseur { get; set; }
}

Ces deux nouvelles classes ne possèdent pas les mêmes informations et le modèle de données précédent ne nous permet d’afficher les informations en fonction de chaque type de la classe de base. C’est là qu’intervient les modèles de données implicites. Avec ces derniers nous allons pouvoir définir un modèle pour chaque classe dérivée. Silverlight se chargera ensuite d’utiliser à notre place de façon dynamque le modèle correspondant à chaque type et donc pas besoin de renseigner la propriété ItemTemplate de notre ListBox ;-).
Un modèle de données implicite se définit en utilisant l’attribut DataType qui doit recevoir un type. Les modèles de données associés aux deux classes dérivées sont pour la classe Appartement :

<DataTemplate DataType="local:Appartement">
	<Border BorderBrush="Gray" BorderThickness="1">
		<Grid Width="400" >
			<Grid.RowDefinitions>
				<RowDefinition />
				<RowDefinition />
				<RowDefinition />
				<RowDefinition />
				<RowDefinition />
				<RowDefinition />
			</Grid.RowDefinitions>
			<Grid.ColumnDefinitions>
				<ColumnDefinition Width="Auto" />
				<ColumnDefinition Width="*" />
			</Grid.ColumnDefinitions>
		
			<TextBlock FontWeight="Bold" Text="Localisation" Grid.Column="0" Grid.Row="0" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Loyer mensuel" Grid.Column="0" Grid.Row="1" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Charge" Grid.Column="0" Grid.Row="2" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Etage" Grid.Column="0" Grid.Row="3" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Ascenseur" Grid.Column="0" Grid.Row="4" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Description" Grid.Column="0" Grid.Row="5" Margin="0,0,2,0" />
		
			<TextBlock Text="{Binding Path=Localisation, Mode=OneWay}" Grid.Column="1" Grid.Row="0" />
			<TextBlock Text="{Binding Path=LoyerMensuel, Mode=OneWay}" Grid.Column="1" Grid.Row="1" />
			<TextBlock Text="{Binding Path=Charge, Mode=OneWay}" Grid.Column="1" Grid.Row="2" />
			<TextBlock Text="{Binding Path=Etage, Mode=OneWay}" Grid.Column="1" Grid.Row="3" Margin="0,0,2,0" />
			<CheckBox IsChecked="{Binding Path=Charge, Mode=OneWay}" IsEnabled="False" Grid.Column="1" Grid.Row="4" Margin="0,0,2,0" />
			<TextBlock Text="{Binding Path=Description, Mode=OneWay}" Grid.Column="1" Grid.Row="5" TextWrapping="Wrap" />
		</Grid>
	</Border>
</DataTemplate>

pour la classe Maison:

<DataTemplate DataType="local:Maison">
	<Border BorderBrush="Gray" BorderThickness="1">
		<Grid Width="400" >
			<Grid.RowDefinitions>
				<RowDefinition />
				<RowDefinition />
				<RowDefinition />
				<RowDefinition />
				<RowDefinition />
			</Grid.RowDefinitions>
			<Grid.ColumnDefinitions>
				<ColumnDefinition Width="Auto" />
				<ColumnDefinition Width="*" />
			</Grid.ColumnDefinitions>

			<TextBlock FontWeight="Bold" Text="Localisation" Grid.Column="0" Grid.Row="0" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Loyer mensuel" Grid.Column="0" Grid.Row="1" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Charge" Grid.Column="0" Grid.Row="2" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Jardin" Grid.Column="0" Grid.Row="3" Margin="0,0,2,0" />
			<TextBlock FontWeight="Bold" Text="Description" Grid.Column="0" Grid.Row="4" Margin="0,0,2,0" />

			<TextBlock Text="{Binding Path=Localisation, Mode=OneWay}" Grid.Column="1" Grid.Row="0" />
			<TextBlock Text="{Binding Path=LoyerMensuel, Mode=OneWay}" Grid.Column="1" Grid.Row="1" />
			<TextBlock Text="{Binding Path=Charge, Mode=OneWay}" Grid.Column="1" Grid.Row="2" />
			<CheckBox IsChecked="{Binding Path=Charge, Mode=OneWay}" IsEnabled="False" Grid.Column="1" Grid.Row="3" Margin="0,0,2,0" />
			<TextBlock Text="{Binding Path=Description, Mode=OneWay}" Grid.Column="1" Grid.Row="4" TextWrapping="Wrap" />
		</Grid>
	</Border>
</DataTemplate>

La solution Visual Studio est téléchargeable ici.

Catégories :Silverlight Étiquettes : ,

Mettre en place un double click avec SL5

Avec Silvelight 4 et antérieurs il était difficile de gérer un double click sur les éléments. La plupart des méthodes qui le permettait utilisaient un Timer comme dans cet exemple ici.
Silvelright 5 nous permet de gérer le double click de la souris et même le multi click de façon très simple ;-). Pour cela nous devons nous abonner aux évènements MouseLeftButtonDown ou MouseRightButtonDown pour respectivement gérer les clicks multiples sur les boutons gauche ou droite de la souris. Dans le code ci-dessous nous gérons uniquement les clicks sur le bouton gauche de la souris :

public partial class MainPage : UserControl
{
	public MainPage()
	{
		InitializeComponent();
		this.myRectangle.MouseLeftButtonDown += new MouseButtonEventHandler(myRectangle_MouseLeftButtonDown);
	}

	void myRectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
	{
		if (e.ClickCount == 2)
		{
			Debug.WriteLine("Double click!");
		}

		if (e.ClickCount == 3)
		{
			Debug.WriteLine("3 clicks détectés");
		}

		if (e.ClickCount > 3)
		{
			Debug.WriteLine("Plusieurs clicks détectés");
		}
	}
}
Catégories :Silverlight Étiquettes : ,

Utiliser un ancêtre comme source du binding est possible en Silverlight 5

La version Beta 1 de Silverlight 5 sortie il y a quelques jours nous permet enfin de spécifier comme source du binding un des ancêtres d’un élément. Dans les versions de Silverlight 3 et 4, seuls les modes Self et TemplateParent étaient supportés alors qu’en WPF nous avons en plus de ces deux modes deux autres qui sont PreviousData et FindAncestor (qui nous permet de spécifier comme source du binding un ancêtre du contrôle). Au fil des développements le besoin de spécifier un ancêtre comme source se faisait de plus en plus sentir et différentes méthodes de controunement avaient déjà été mises en place par des développeurs. Maintenant plus besoin de ces méthodes, SL5 permet de faire cela comme dans WPF.
L’exemple de code suivant utilise comme source du binding le contrôle StackPanel qui représente un des ancêtres du bouton sur lequel s’effectue le binding :

<UserControl x:Class="SilverlightApplication11.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">

    <StackPanel x:Name="LayoutRoot" Background="White" Tag="Tag from StackPanel">
        <Rectangle Height="50" Fill="Green" x:Name="myRectangle" />
        <Button Content="{Binding Path=Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType=StackPanel}}" />
    </StackPanel>
</UserControl>

Bien que le mode FindAncestor soit maintenant présent, le mode PreviousData (très rarement utilisé dans WPF d’ailleurs) n’est pas encore présent dans cette béta de Silvelright 5.

Catégories :Silverlight Étiquettes : , ,

Silverlgiht 5 Beta 1 est disponible !

Lors de la deuxième journée du keynote au MIX11 (je n’y étais pas, je l’ai suivi en live streaming ;-)), Scott Guthrie à annoncer la sortie de la version Beta 1 de Silverlight 5. La plupart des fonctionnalités citées lors du Silverlight Firestater du 2 décembre 2011 ont été intégrées dans cette Beta. Pour ceux qui n’ont pas vu passer cet évènement, je les invite à consulter ce fichier pdf pour une liste cpomplètes des fonctionnalités apportées par Silverlight 5 Béta 1.

Pour pouvoir installer Silverlight 5 Béta 1 vous devez disposser de la version 2010 de Visual Stuido Express ou non avec le SP1 installé. Ici vous trouverez les tools Silvelright 5 pour Visual Studio SP1 qui vous permet d’installer :

  1. La version développeur du runtime Silverlight 5
  2. Le SDK de Silverlight 5 Beta 1
  3. La version Preview de Microsoft WCF RIA Services V1.0 SP2 datant d’April 2011
  4. Une mise à jour KB2502836 pour Visual Studio 2010 Service Pack 1 et Visual Web Developer Express 2010 Service Pack 1

Tutoriaux sur les nouveautés apportées par cette version de SL5 à venir 😉

Catégories :Silverlight Étiquettes :

La version finale RTW (Release To Web) d’EF 4.1 est sortie !

12 avril 2011 2 commentaires

L’approche Code First et l’abstraction des divers approches à travers l’API DbContext sont les deux fonctionnalités qui ont vu le jour avec l’arrivée d’EF 4.1. Une version finale RTW d’EF 4.1 est accessible par téléchargement depuis hier en version stand-alone ou via NuGet avec l’installation du package EntityFramework. Il faut noter que l’installation via NuGet ne vous permet pas d’installer des templates Visual Studio.

Pas de grands changements mis à part la correction de bugs notamment le bug lié à l’utilisation d’EF avec SQL Compact. Les améliorations telles que le support des enums, des procédures stockées et d’autres ne sont pas encore apportées à cette version.
Pour plus d’informations voir ici.

Catégories :Entity Framework Étiquettes : , ,
%d blogueurs aiment cette page :