Existe uma maneira de usar a inheritance de modelos de dados no WPF?

É possível ter composição ou inheritance de DataTemplate (semelhante a “BasedOn” em Styles)? Existem 2 instâncias em que preciso disso.

  1. Para classs herdadas: Eu tenho uma class base com várias classs herdadas. Eu não quero duplicar o modelo de class base em cada um dos DataTemplate da class derivada.

  2. Vistas diferentes: para a mesma class, quero definir um datatemplate e, em seguida, adicionar a esse modelo, conforme apropriado. Ex. o modelo base exibirá os dados no object e, em seguida, eu quero modelos diferentes que possam executar ações diferentes no object, enquanto exibem os dados (herdando o modelo base).

A única coisa que eu encontrei fazer para esse tipo de coisa é esta:

             

Basicamente isso cria um modelo “comum” que pode ser referenciado usando uma chave (BaseClass neste caso). Em seguida, definimos o DataTemplate real para a class base e quaisquer classs derivadas. O modelo de class derivada, em seguida, adicionaria seu próprio “material”.

Houve alguma discussão sobre isso no msdn um tempo atrás, mas ninguém veio com uma solução melhor que eu vi.

@Fragilerus e @Liz, na verdade eu acho que surgiu algo melhor. Aqui está outra abordagem que não apenas evita a binding extra do ContentPresenter, mas também elimina a necessidade de aplicar um modelo em um modelo, já que o conteúdo compartilhado é conteúdo direto que é definido em tempo de compilation. A única coisa que acontece no tempo de execução são as ligações que você configura dentro do conteúdo direto. Como tal, isso acelera muito a interface do usuário quando comparado à outra solução.

             

Importante: Certifique-se de usar o atributo x:Shared em seu conteúdo compartilhado ou isso não funcionará.

O caminho do WPF’y

O acima dito, isso realmente não é a maneira mais amigável WPF para fazer o que você está depois. Isso pode ser conseguido usando a class DataTemplateSelector que faz exatamente isso … selecione um modelo de dados com base em qualquer critério que você definir.

Por exemplo, você pode facilmente configurar um que procure por seus tipos de dados conhecidos e retorne o mesmo DataTemplate para ambos, mas para todos os outros tipos, ele retorna ao sistema para resolver o DataTemplate. Isso é o que realmente fazemos aqui.

Espero que isto ajude! 🙂

Intereting Posts