Pregunta

¿Cómo puedo configurar el DataContext en mi Grid en XAML, en lugar de en el constructor?

Aquí es cómo lo hago en el constructor (LayoutRoot es la cuadrícula XAML definida en la XAML):

this.LayoutRoot.DataContext = this.HPVM;

Preferiría hacerlo directamente en XAML, pero no sé cómo hacer referencia al objeto HPVM en XAML. HPVM es una propiedad pública en la clase USerControl.

Funciona bien como se indica anteriormente, pero nuevamente, solo quiero saber cómo se hacen las propiedades de la clase UserControl en XAML, en lugar de tener que hacerlo siempre en código.

Aquí está todo el código relevante:

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

Y aquí está mi constructor donde el DataContext está configurado actualmente:

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
        }

Todo funciona bien, pero solo quiero aprender a configurar DataContext en XAML, no en código.

¿Fue útil?

Solución

La respuesta que Chris dio funciona bien. He probado y funcionó para mí. Puede crear una instancia de su clase en XAML (dentro de UserControl.Resources) y a continuación, enlace el datacontext a un recurso estático.

Código de seguimiento:


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

Otros consejos

La siguiente monstruosidad funciona en Silverlight 4

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

prueba algo como esto .....

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

donde HPVM es un miembro público de este - > tu forma etc.

Crea la instancia de tu clase en el xaml, agregando algo como esto a tu sección de recursos ... (no olvides agregar tu espacio de nombres xmlns)

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

luego, vincule el contexto de datos al recurso estático que acaba de agregar ...

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

En Silverlight 4, pude hacer que esto funcionara haciendo lo siguiente:

Dar a la página / UserControl una x: Nombre = " myPage "

En su enlace de control, utilice la sintaxis de oferta del elemento normal. En mi caso, quiero enlazar a una colección observable de objetos en mi código detrás de mi propiedad ItemsSource:

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

No he intentado esto con DataContext pero sé que puede hacer enlace de elemento a elemento para DataContext como lo hago para Grids cuyo contexto se basa en el elemento seleccionado de algún otro menú desplegable en la página.

Esto no es posible (es posible en WPF con {Binding RelativeSource = {RelativeSource Self}} , pero Silverlight es más limitado.

Tienes que hacerlo a través del código.

<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top