Pergunta

Como posso definir o DataContext no meu grade em XAML, em vez de no construtor?

Aqui está como eu faço isso no construtor (LayoutRoot é o XAML Grade definido no XAML):

this.LayoutRoot.DataContext = this.HPVM;

Eu preferiria fazê-lo bem no XAML, mas eu não sei como fazer referência o objeto HPVM em XAML. HPVM é uma propriedade pública na classe UserControl.

Ele funciona muito bem como listado acima, mas novamente, eu só quero saber como propriedades da classe UserControl no XAML, em vez de sempre ter que fazê-lo no código.

Aqui está todo o 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>
    ...

E aqui está o meu construtor onde o DataContext está definido:

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
        }

Tudo funciona bem, mas eu só quero saber como definir o DataContext no XAML, não no código.

Foi útil?

Solução

A resposta Chris deu funciona muito bem. Eu testei e funcionou para mim. Você pode instanciar sua classe em XAML (dentro dos UserControl.Resources) e em seguida, ligam o datacontext a um recurso estático.

código a seguir:


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

Outras dicas

A seguir monstruosidade trabalha em Silverlight 4

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

Tente algo assim .....

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

onde HPVM é um membro do público desta -.> Sua forma etc

Criar a instância de sua classe no XAML, adicionando algo assim para sua seção de recursos .... (não se esqueça de adicionar o seu xmlns namespace)

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

então, vincular o contexto de dados para o recurso estático que você acabou de adicionar ....

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

Em Silverlight 4, eu era capaz de começar este trabalho, fazendo o seguinte:

Dê a Página / UserControl um x: Name = "myPage"

Em seu controle do uso obrigatório a sintaxe normal do bidning Elemento. No meu caso eu quero vincular a uma coleção observável de objetos no meu código por trás de minha propriedade ItemsSource:

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

Eu não tentei isso com DataContext mas sabe que pode fazer elemento de ligação para DataContext elemento como eu faço isso para Grids cujo contexto é baseado no item selecionado de algum outro drop down na página.

Isto não é possível (é possível no WPF com {Binding RelativeSource={RelativeSource Self}}, mas Silverlight é mais limitada.

Você tem que fazê-lo por meio de código.

<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top