La liaison Silverlight UserControl propriétés personnalisées à ses éléments
Je suis en train de faire un simple jeu de puzzle de mots croisés de Silverlight 2.0. Je suis en train de travailler sur un UserControl-ish composant qui représente un carré dans le puzzle. Je vais avoir des problèmes avec la liaison de mon UserControl propriétés avec ses les " éléments. J'ai enfin (un peu) eu de travail (peut être utile pour certains, il m'a fallu quelques longues heures), mais a voulu le rendre plus "élégante".
J'ai imaginé qu'il devrait avoir un compartiment pour le contenu et une étiquette (dans le coin supérieur droit) qui contient éventuellement son numéro. Le contrôle de contenu probablement être une zone de texte, tandis que l'étiquette de contrôle pourrait être un TextBlock. J'ai donc créé un UserControl avec cette structure de base (les valeurs sont codées en dur, à ce stade):
<UserControl x:Class="XWord.Square"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
FontSize="30"
Width="100" Height="100">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock x:Name="Label" Grid.Row="0" Grid.Column="1"
Text="7"/>
<TextBox x:Name="Content" Grid.Row="1" Grid.Column="0"
Text="A"
BorderThickness="0" />
</Grid>
</UserControl>
J'ai également créé DependencyProperties dans le Carré de la classe comme ceci:
public static readonly DependencyProperty LabelTextProperty;
public static readonly DependencyProperty ContentCharacterProperty;
//...(static constructor with property registration, .NET properties
//omitted for brevity)...
Maintenant, j'aimerais comprendre comment lier l'Étiquette et le Contenu de l'élément pour les deux propriétés. Je fais comme ça (dans le fichier code-behind):
Label.SetBinding( TextBlock.TextProperty, new Binding { Source = this, Path = new PropertyPath( "LabelText" ), Mode = BindingMode.OneWay } );
Content.SetBinding( TextBox.TextProperty, new Binding { Source = this, Path = new PropertyPath( "ContentCharacter" ), Mode = BindingMode.TwoWay } );
Qui serait plus élégant fait dans le code XAML. Personne ne sait comment c'est fait?
- Une question importante mais difficile à répondre.
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, définissez le DataContext sur le UserControl à l'aide de {RelativeSource Self}:
Maintenant, vous pouvez lier les différents éléments aux propriétés de l'objet usercontrol:
Pour SL 2.0, vous aurez besoin de mettre le DataContext sur le UserControl est Chargé de gestionnaire d'événements.
Que Silverlight ne peut pas utiliser FindAncestor technique, vous pouvez utiliser une astuce similaire à celle qui définit l'objet UserControl nom, mais sans rupture de ses fonctionnalités en utilisant le nom de l'LayoutRoot...
Il a travaillé dans SL3 sans avoir à ajouter du code supplémentaire (je l'utilise dans un WP7 app), mais vous ne savez pas si vous pouvez l'utiliser dans SL2. Eh bien, je me rends compte maintenant à quel point cette question est ancienne, j'espère que c'est toujours utile, je suis arrivé ici parce que les réponses que j'ai obtenu pour le même problème dans WP7 n'ai pas à m'en convaincre.
Je pense que vous êtes à la recherche pour Élément d'INTERFACE utilisateur à l'Élément de Liaison qui est une fonction de Silverlight 3.
J'ai peut-être pas la compréhension de votre problème exactement. Dans Silverlight, vous êtes capable de se lier à presque n'importe quel objet de données. Donc, si vous avez un PuzzleSquare classe qui contient des propriétés du Contenu et de l'Étiquette, vous pouvez lier à ces propriétés directement à partir de l'objet.
Disons que vous avez créé un objet simple PuzzleSquare:
Donc, si vous êtes la construction de l'application avec le point de vue classique/code derrière le modèle, votre code derrière voudrais ajouter cet objet à la propriété DataContext de la grille sur la page de chargement:
Votre Xaml se lient à la Place de la propriété:
Cela fait-il sens?
ib.
Cette travaillé dans Silverlight 4.0
Mettre un nom sur le contrôle UserControl, puis reportez-vous à elle dans le TextBlock
Essayez ceci:
Je peux lier en XAML et le code derrière.