web-dev-qa-db-fra.com

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

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 veux simplement savoir comment définir les propriétés de la classe UserControl dans XAML, plutôt que de toujours devoir le faire en 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.

30
MattSlay

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 .__, puis lier le contexte de données à une ressource statique.

Suivez le code:


<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>
24
Klinger

La monstruosité suivante fonctionne dans Silverlight 4

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
10
Chui Tey
<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>
6
someguy

essayez quelque chose comme ça .....

<Grid DataContext="{Binding Path=HPVM}">
</Grid>

où HPVM est un membre public de ceci -> votre formulaire, etc.

Créez l'instance de votre classe dans le xaml, en ajoutant quelque chose comme ceci à votre section ressources ....

<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>
2
Muad'Dib

Dans Silverlight 4, j'ai pu résoudre ce problème en procédant comme suit: 

Donnez à la Page/UserControl un x: Name = "myPage"

Dans votre liaison de contrôle, utilisez la syntaxe de soumission normale 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 faire la liaison d'élément à élément pour DataContext, comme je le fais pour les grilles dont le contexte est basé sur l'élément sélectionné d'une autre liste déroulante de la page.

1
Doug
<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
0
Jacfay

Ce n'est pas possible (C'est possible avec WPcode avec {Binding RelativeSource={RelativeSource Self}}, mais Silverlight est plus limité.

Vous devez le faire avec du code.

0
Srdjan Jovcic