Pergunta

Usando o Mvvm-Pattern Você define o DataContext para um ViewModel específico. Agora, existe alguma maneira de dizer ao XAML o tipo de datacontext para que ele valide minhas ligações?

Procurando algo como o ViewData digitado no ASP.NET MVC.

Foi útil?

Solução

Não, a especificação atual não possui uma digitação forte no XAML. Acredito que com o .NET 4.0, XAML deve estar vendo a capacidade de genéricos. Com isso, eu acho que deveria ser muito mais fácil ter uma digitação forte em XAML.

Outras dicas

Você pode escrever cada ligação individual de uma maneira fortemente tipada:

<TextBox Text="{Binding Path=(vm:Site.Contact).(vm:Contact.Name)}" />

No entanto, isso não validaria o fato de que o TextBox DataContext é do tipo ViewModel.site (e acho que isso não é possível, mas posso estar errado).

Não. FrameworkElement.DatatContext é a propriedade de dependência que permite a ligação de dados é do tipo object.

Como apontado por outros, você pode especificar o tipo esperado de um DataContext Para um modelo especial chamado A DataTemplate. Muitos controles, como ItemsControl, ControlControl Forneça acesso aos dados do DATATEMPLATES para permitir que você defina as expectativas da representação visual do tipo DataContext.

Bryan está correto, ele não testou seu código.

A aplicação correta de um datatemplate digitado se parece com o seguinte:

<Window>
    <Window.Resources>
        <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
        ...
        </DataTemplate>
    </Window.Resources>
    <ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" />
</Window>

O ContentPresenter herda diretamente da estrutura e não possui uma propriedade de modelo. Além disso, a propriedade de modelo geralmente se refere ao controle.

Eu acho que Bryan estava pensando no ContentControl que é um dos dois tipos de controle radicular (o outro sendo ItemsControl). ContentControl De fato, herda do controle. Portanto, podemos especificar a propriedade de modelo, se assim o escolhermos.

<Window>
   <Window.Resources>
      <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
      ...
      </DataTemplate>
      <ControlTemplate x:Key="ControlSkin" TargetType="{x:Type ContentControl}">
      ...
      </ControlTemplate>
   </Window.Resources>
   <ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" Template="{StaticResource ControlSkin}" />
</Window>

Pessoalmente, declaro um patrimônio estático para cada propriedade em meu viewmodel a referência, usando x: estático como caminho de ligação - por exemplo

public class MyViewModel
{
  public static PropertyPath MyPropertyPath = new PropertyPath("MyProperty");
  public bool MyProperty{get; set;}
}

xaml: {Binding Path={x:Static local:MyViewModel.MyPropertyPath}}

Dessa forma, todas as minhas ligações são validadas na construção.

Experimente isso:

<Window>
    <Window.Resources>
        <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
            ...
        </DataTemplate>
    </Window.Resources>

    <ContentPresenter Content="{Binding}" Template="{StaticResource TypedTemplate}" />
</Window>

Eu não testei este código, mas deve lhe dar a ideia. O apresentador de conteúdo exibirá o datacontext atual que usará o DataTemplate. Isso não é fortemente digitado no compilador, mas lançará um erro de tempo de execução imediatamente no carregamento (na inicialização da janela). Você poderá pegar isso facilmente em seus testes se algo quebrar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top