Silverlight - Définition de DataContext dans XAML plutôt que dans le constructeur?

StackOverflow https://stackoverflow.com/questions/606803

  •  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.

Était-ce utile?

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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top