Silverlight - ¿Configurando DataContext en XAML en lugar de en constructor?


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

Así es como lo hago en el constructor (LayoutRoot es la Cuadrícula XAML definida en el XAML):

this.LayoutRoot.DataContext = this.HPVM;

Preferiría hacerlo bien en el 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 mencionó anteriormente, pero nuevamente, solo quiero saber cómo hacer las propiedades de la clase UserControl en XAML, en lugar de que siempre tener que hacerlo 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á actualmente establecido:

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 el DataContext en XAML, no en código.

Author: MattSlay, 2009-03-03

7 answers

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

Siga el código:


<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
Author: Klinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-04 22:44:12

La siguiente monstruosidad funciona en Silverlight 4

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
 10
Author: Chui Tey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-21 13:44:08
<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>
 6
Author: someguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-30 13:58:46

Intenta algo como esto.....

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

Donde HPVM es un miembro público de este form > su formulario, etc.

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

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

Luego, enlaza el contexto de datos al recurso estático que acabas de agregar....

<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource franken}">
    <TextBox  Background="Red" Foreground="White" Text="{Binding Path=sum}"  />
</Grid>
 2
Author: Muad'Dib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-03 17:43:27

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

Dale a la Página / UserControl un x: Name = "MyPage"

En su enlace de control use la sintaxis normal de puja de elementos. 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 probado esto con DataContext, pero sé que puede hacer enlace de elemento a elemento para DataContext como lo hago para Cuadrículas cuyo contexto se basa en el elemento seleccionado de algún otro desplegable en la página.

 1
Author: Doug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-04 21:12:38

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.

 0
Author: Srdjan Jovcic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-22 03:30:33
<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
 0
Author: Jacfay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-13 21:29:06