2009-03-03 20 views
30

¿Cómo puedo configurar DataContext en mi cuadrícula en XAML, en lugar de en el constructor?Silverlight: ¿Configurar DataContext en XAML en lugar de en constructor?

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

this.LayoutRoot.DataContext = this.HPVM; 

yo 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 menciona anteriormente, pero de nuevo, solo quiero saber cómo a las propiedades de la clase UserControl en XAML, en lugar de tener que hacerlo siempre en el código.

Aquí es todo el código en cuestión:

<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í es mi constructor donde el DataContext se establece 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 sólo quiero aprender a establece el DataContext en XAML, no en el código.

Respuesta

24

La respuesta que dio Chris funciona muy bien. He probado y funcionó para mí. Puede crear una instancia de su clase en XAML (dentro de UserControl.Resources) y y luego enlazar el contexto de datos 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> 
 
+0

Si instanciar la clase ViewModel en XAML, ¿puedo seguir haciendo referencia en el constructor de código subyacente? La razón por la que pregunto es que actualmente establezco algunos valores en ViewModel en el constructor antes de que se muestre el formulario al usuario. – MattSlay

+3

Sí, puedes. Puede hacer lo siguiente: var aCustomer = this.Resources ["Cust"] como Cliente; aCustomer.Name = "abc"; – Klinger

+2

Olvidé agregar un atributo x: Nombre. x: La clave funciona dentro de XAML y x: el nombre hace que el objeto sea visible para el código. – Klinger

2

intentar algo como esto .....

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

donde HPVM es un miembro del público de este -> su forma, etc.

Crear la instancia de su clase en el XAML, por añadiendo algo como esto a su sección de recursos .... (no se olvide de añadir su espacio de nombres xmlns)

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

a continuación, unir el contexto de datos al recurso estático que acaba de añadir ....

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

No funciona. Es necesario que haya un camino que diga dónde está HPVM. en el método de código, que lo que es "esto". parte lo hace HPVM es una propiedad de la clase. No puedo encontrar la manera correcta de hacer referencia a la clase instanciada para llegar a HPVM. – MattSlay

+0

Agregué más código en la pregunta original. – MattSlay

+0

El segundo ejemplo de código funciona, pero * crea * el objeto en XAML. Todavía no aborda el acceso a las instancias de objetos creados por el constructor de XAML. Lo mejor que puedo decir es que no se puede hacer. Debe establecer DataContext desde el código si el objeto se crea en código. – MattSlay

0

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.

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

La siguiente monstruosidad trabaja en Silverlight 4

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

Acabo de vomitar un poco, en mi boca. – Cheeso

1

En Silverlight 4, que era capaz de conseguir este trabajo de la siguiente manera:

Dale a la página/UserControl una x: Name = "myPage"

En su enlace de control use la sintaxis normal de licitación de elementos.En mi caso quiero que se unen a una colección de objetos observables 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 un elemento a otro vinculante para DataContext como yo Haga esto para Grids cuyo contexto se basa en el elemento seleccionado de algún otro desplegable en la página.

+0

¡Brillante! Eso ciertamente lo solucionó para mí. Muchas gracias. – SGarratt

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

Solo necesitas agregar Jacfay

Cuestiones relacionadas