implementar - WPF: conmutando UserControls según los ViewModels correspondientes(MVVM)
wpf c# mvvm (2)
¿Es posible deducir el control de usuario necesario basado en un tipo de modelo de vista?
¿Quieres decir así?
<Window.Resources>
<DataTemplate DataType="{x:Type vm:LionViewModel}">
<v:LionView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:SnakeViewModel}">
<v:SnakeView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:BirdViewModel}">
<v:BirdView"/>
</DataTemplate>
</Window.Resources>
Consulte "Aplicación de una vista a un modelo de vista" en el artículo de Josh Smith sobre MVVM .
Editar:
Aquí hay un ejemplo trivial de selección de plantilla basada en el tipo que puede pegar en Kaxaml para probarse a sí mismo que realmente funciona:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Page.Resources>
<sys:String x:Key="string">this is a string</sys:String>
<sys:Int32 x:Key="int32">1234</sys:Int32>
<DataTemplate DataType="{x:Type sys:String}">
<TextBlock Foreground="Red" Text="{Binding}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type sys:Int32}">
<TextBlock Foreground="Blue" Text="{Binding}"/>
</DataTemplate>
</Page.Resources>
<StackPanel>
<ContentControl Content="{Binding Source={StaticResource string}}"/>
<ContentControl Content="{Binding Source={StaticResource int32}}"/>
</StackPanel>
</Page>
Trataré de simplificar la tarea en la que estoy trabajando imaginando este ejemplo:
Supongamos que tenemos la siguiente jerarquía de clases modelo:
Animal
Lion
Snake
Bird
... ViewModels correspondientes:
AnimalCollectionViewModel
AnimalViewModel
LionViewModel
SnakeViewModel
BirdViewModel
... y vistas correspondientes:
AnimalCollectionView
LionView
SnakeView
BirdView
Se supone que AnimalCollection contiene una lista llena de objetos de diferentes tipos de animales y debajo de la lista tiene una cuadrícula de propiedades para establecer las propiedades de un animal seleccionado. Obviamente, las redes de propiedades tendrán diferentes propiedades y deberían cambiar cuando cambie el tipo de elemento seleccionado.
La pregunta es: ¿Cómo implementar la conmutación de las redes de propiedades en WPF de acuerdo con el patrón de MVVM? ¿Usando qué mecanismo?
Actualmente tengo una propiedad enum abstracta en la base ViewModel (AnimalViewModel.PropertyGridType = {Lion, Snake, Bird}) que las clases derivadas implementan al devolver los valores correspondientes. Y AnimalCollectionView cambia los controles de usuario de la cuadrícula de propiedades según el valor de esta propiedad. Algo como esto:
...
<UserControl.Resources>
<Style x:Key="PropertyGridStyle" TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding PropertyGridType}" Value="Lion">
<Setter Property="Content">
<Setter.Value>
<view:LionPropertyGridView />
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding PropertyGridType}" Value="Snake">
<Setter Property="Content">
<Setter.Value>
<view:SnakePropertyGridView />
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<ContentControl Style="{StaticResource PropertyGridStyle}" />
...
Pero no estoy seguro de si es el enfoque correcto. (Al menos no me gusta introducir la propiedad enum auxiliar. ¿Es posible deducir el control de usuario necesario basado en un tipo de modelo de vista?) ¿Alguien puede aconsejar otras opciones? ¡Gracias por adelantado!
Puede usar DataTemplateSelector para eso. El método de elegir la plantilla correcta depende de usted. Puedes usar enums o test para el tipo de clase si lo deseas.