Silverlight - Définition de DataContext dans XAML plutôt que dans le constructeur?
-
03-07-2019 - |
Question
Comment définir le DataContext sur ma grille en XAML plutôt que dans le constructeur?
Voici comment je le fais dans le constructeur (LayoutRoot est la grille XAML définie dans le XAML):
this.LayoutRoot.DataContext = this.HPVM;
Je préférerais le faire correctement dans le XAML, mais je ne sais pas comment référencer l'objet HPVM dans le XAML. HPVM est une propriété publique de la classe USerControl.
Cela fonctionne bien comme indiqué ci-dessus, mais encore une fois, je souhaite simplement savoir comment définir les propriétés de la classe UserControl dans XAML, plutôt que de toujours devoir le faire dans le code.
Voici tout le code pertinent:
<UserControl x:Class="SilverlightApplication1.SLHolePattern" x:Name="HolePatternsControl"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls"
xmlns:local="clr-namespace:SilverlightApplication1"
xmlns:GeoPatterns="clr-namespace:GeoPatterns"
Height="700">
<UserControl.Resources>
...
Et voici mon constructeur où le DataContext est actuellement défini:
namespace SilverlightApplication1
{
public partial class SLHolePattern : UserControl, INotifyPropertyChanged
{
public HolePatternsViewModel HPVM;
public SLHolePattern()
{
InitializeComponent();
this.HPVM=new HolePatternsViewModel();
this.LayoutRoot.DataContext = this.HPVM;
...more code here
}
Tout fonctionne bien, mais je veux juste apprendre à définir le DataContext en XAML, pas en code.
La solution
La réponse que Chris a donnée fonctionne très bien. J'ai testé et cela a fonctionné pour moi. Vous pouvez instancier votre classe en XAML (dans UserControl.Resources) et liez ensuite le datacontext à une ressource statique.
Code de suivi:
<UserControl ...>
<UserControl.Resources>
<myNS:MyClass x:Name="TheContext" x:Key="TheContext"></myNS:MyClass>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource TheContext}" >
<TextBlock Text="{Binding Path=Field1}">
</TextBlock>
</Grid>
</UserControl>
Autres conseils
La monstruosité suivante fonctionne dans Silverlight 4
<UserControl
DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
<UserControl.DataContext>
<vm:ThisUCViewModel />
</UserControl.DataContext>
essayez quelque chose comme ça .....
<Grid DataContext="{Binding Path=HPVM}">
</Grid>
où HPVM est un membre public de cela - > votre formulaire, etc.
Créez l'instance de votre classe dans le xaml en ajoutant quelque chose comme cela à votre section ressources .... (n'oubliez pas d'ajouter votre espace de noms xmlns)
<my:bogart x:Key="franken"/>
liez ensuite le contexte de données à la ressource statique que vous venez d'ajouter ....
<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource franken}">
<TextBox Background="Red" Foreground="White" Text="{Binding Path=sum}" />
</Grid>
Dans Silverlight 4, j’ai réussi à faire fonctionner cela en procédant comme suit:
Donnez au Page / UserControl un x: Name = "myPage"
Dans votre liaison de contrôle, utilisez la syntaxe normale pour les enchères par élément. Dans mon cas, je souhaite établir une liaison avec une collection observable d'objets dans mon code derrière pour ma propriété ItemsSource:
<ComboBox
ItemsSource={Binding ElementName=myPage, Path=MyObservableObjectList, Mode=TwoWay}
Je n'ai pas essayé cela avec DataContext, mais je sais que vous pouvez créer une liaison élément à élément pour DataContext, comme je le fais pour des grilles dont le contexte est basé sur l'élément sélectionné d'un autre menu déroulant de la page.
Cela n'est pas possible (c'est possible dans WPF avec {Binding RelativeSource = {RelativeSource Self}}
, mais Silverlight est plus limité.
Vous devez le faire avec du code.
<UserControl.Resources>
<ResourceDictionary>
<vm:YourModelx:Key="myModel"/>
</ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
<Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>