Domanda

Come posso impostare DataContext sulla mia griglia in XAML, anziché nel costruttore?

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

this.LayoutRoot.DataContext = this.HPVM;

Preferirei farlo correttamente in XAML, ma non so come fare riferimento all'oggetto HPVM in XAML. HPVM è una proprietà pubblica della classe USerControl.

Funziona bene come elencato sopra, ma ancora una volta, voglio solo sapere come proprietà della classe UserControl in XAML, piuttosto che doverlo sempre fare nel codice.

Ecco tutto il codice rilevante:

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

Ed ecco il mio costruttore in cui è attualmente impostato 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 come impostare DataContext in XAML, non nel codice.

È stato utile?

Soluzione

La risposta di Chris ha funzionato bene. Ho testato 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.

Segui il 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>

Altri suggerimenti

La seguente mostruosità funziona in Silverlight 4

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>

prova qualcosa del genere .....

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

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

Crea l'istanza della tua classe in xaml, aggiungendo qualcosa di simile alla sezione delle risorse .... (non dimenticare di aggiungere il tuo spazio dei nomi xmlns)

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

quindi, associa il contesto dei dati alla risorsa statica che hai appena aggiunto ....

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

In Silverlight 4, sono stato in grado di farlo funzionare nel modo seguente:

Assegna a Page / UserControl un x: Name = " myPage "

Nella tua associazione di controllo usa la normale sintassi di offerta di elementi. Nel mio caso, desidero associarmi a una raccolta osservabile di oggetti nel mio codice per la proprietà ItemsSource:

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

Non ho provato questo con DataContext ma so che puoi fare il binding da elemento a elemento per DataContext mentre lo faccio per Grid il cui contesto è basato sull'elemento selezionato di qualche altro menu a discesa sulla pagina.

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

Devi farlo tramite il codice.

<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top