Silverlight - Definir DataContext no XAML, em vez de no construtor?
-
03-07-2019 - |
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.
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>