2009-03-03 9 views
30

Come posso impostare DataContext sulla mia griglia in XAML, anziché nel costruttore?Silverlight: impostazione di DataContext in XAML anziché nel costruttore?

Ecco come lo faccio nel costruttore (LayoutRoot è la griglia XAML definito nel XAML):

this.LayoutRoot.DataContext = this.HPVM; 

preferirei farlo proprio in XAML, ma non so come fare riferimento all'oggetto HPVM in XAML. HPVM è una proprietà pubblica sulla classe USerControl.

Funziona correttamente come elencato sopra, ma, ancora una volta, voglio solo sapere come proprietà della classe UserControl in XAML, piuttosto che dover sempre farlo in codice.

Qui è tutto il codice in questione:

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

E qui è il mio costruttore in cui è attualmente impostato il DataContext:

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 
     } 

Funziona tutto bene, ma voglio solo imparare a imposta il DataContext in XAML, non nel codice.

risposta

24

La risposta che Chris ha dato funziona bene. Ho provato e ha funzionato per me. È possibile creare un'istanza della classe in XAML (all'interno di UserControl.Resources) e quindi associare il datacontext a una risorsa statica.

CODICE:

 

<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> 
 
+0

Se istanzio la classe ViewModel in XAML, posso comunque fare riferimento nel costruttore code-behind? Il motivo per cui lo chiedo è che attualmente imposto alcuni valori sul ViewModel nel costruttore prima che il modulo venga mostrato all'utente. – MattSlay

+3

Sì, è possibile. Puoi fare come segue: var aCustomer = this.Resources ["Cust"] come Cliente; aCustomer.Name = "abc"; – Klinger

+2

Ho dimenticato di aggiungere un attributo x: Name. x: la chiave funziona in XAML e x: Name rende l'oggetto visibile al codice. – Klinger

2

provare qualcosa di simile .....

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

dove HPVM è un membro pubblico di questo -> modulo ecc

Creare l'istanza della classe in XAML, per l'aggiunta di qualcosa di simile alla sezione risorse .... (non dimenticare di aggiungere il namespace xmlns)

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

quindi, associare il contesto dati alla risorsa statica appena aggiunto ....

<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource franken}"> 
    <TextBox Background="Red" Foreground="White" Text="{Binding Path=sum}" /> 
</Grid> 
+0

Non funziona. Ci deve essere un percorso in qualche modo che dice dove è HPVM. nel metodo del codice, quello che il "questo". parte fa. HPVM è una proprietà sulla classe. Non riesco a capire il modo giusto per fare riferimento alla classe istanziata per arrivare a HPVM. – MattSlay

+0

Ho aggiunto altro codice nella domanda originale. – MattSlay

+0

Il secondo esempio di codice funziona, ma * crea * l'oggetto in XAML. Ancora non si occupa dell'accesso alle istanze di oggetti create dal costruttore da XAML. Meglio posso dire che non può essere fatto. È necessario impostare DataContext dal codice se l'oggetto viene creato nel codice. – MattSlay

0

Questo non è possibile (è possibile in WPF con {Binding RelativeSource={RelativeSource Self}}, ma Silverlight è più limitato.

Devi farlo attraverso il codice.

6
<UserControl.DataContext> 
    <vm:ThisUCViewModel /> 
</UserControl.DataContext> 
10

Il seguente mostruosità funziona in Silverlight 4

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

Ho appena vomitato un po ', nella mia bocca. – Cheeso

1

In Silverlight 4, sono stato in grado di ottenere questo lavoro nel modo seguente:

Dare alla pagina/UserControl una x: Name = "myPage"

Nel bind di controllo utilizzare la sintassi di offerta dell'elemento normale.Nel mio caso voglio associare a una collezione di oggetti osservabili nel mio codice dietro per la mia proprietà ItemsSource:

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

Non ho provato questo con DataContext, ma so che si può fare elemento a elemento vincolante per DataContext come ho fallo per Grids il cui contesto è basato sull'elemento selezionato di qualche altro menu a discesa nella pagina.

+0

Brillante! Questo sicuramente lo ha risolto per me. Grazie mille. – SGarratt

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

Hai solo bisogno di aggiungere Jacfay