30 votes

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

Comment puis-je définir le DataContext de ma grille dans XAML, au lieu de le faire dans le constructeur ?

Voici comment je procède dans le constructeur (LayoutRoot est la grille XAML définie dans le XAML) :

this.LayoutRoot.DataContext = this.HPVM;

Je préférerais le faire directement 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 une fois encore, je veux juste savoir comment utiliser les propriétés de la classe UserControl dans XAML, plutôt que de devoir toujours 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 comment définir le DataContext dans le XAML, et non dans le code.

23voto

Klinger Points 3096

La réponse donnée par Chris fonctionne très bien. J'ai testé et cela a fonctionné pour moi. Vous pouvez instancier votre classe dans le XAML (dans le UserControl.Resources), puis lier le conteneur de données à la classe. puis lier le datacontext à 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>

10voto

Chui Tey Points 1904

La monstruosité suivante fonctionne dans Silverlight 4

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">

6voto

someguy Points 51
<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>

2voto

Muad'Dib Points 14260

Essayez quelque chose comme ceci : .....

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

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

Créez l'instance de votre classe dans le xaml, en ajoutant quelque chose comme ceci à votre section ressources.... (n'oubliez pas d'ajouter votre espace de noms xmlns)

<my:bogart x:Key="franken"/>

puis, lier 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>

1voto

Doug Points 11

Dans Silverlight 4, j'ai réussi à obtenir ce résultat en procédant comme suit :

Donnez au Page/UserControl un x:Name="myPage".

Dans votre liaison de contrôle, utilisez la syntaxe normale de soumission d'éléments. Dans mon cas, je veux me lier à une collection d'objets observables dans mon code derrière pour ma propriété ItemsSource :

<ComboBox 
    ItemsSource={Binding ElementName=myPage, Path=MyObservableObjectList, Mode=TwoWay}

Je n'ai pas essayé avec DataContext, mais je sais qu'il est possible d'établir des liaisons 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é dans une autre liste déroulante de la page.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X