wpf xaml data-binding datatemplate

wpf - Diferentes vistas/plantillas de datos basadas en la variable miembro



datatemplate wpf c# (2)

Por lo general, utilizo un ContentControl para mostrar los datos y cambio la ContentTemplate en un desencadenante según la propiedad que cambia.

Aquí hay un ejemplo que he publicado en mi blog que intercambia una plantilla basada en una propiedad vinculada

<DataTemplate x:Key="PersonTemplate" DataType="{x:Type local:ConsumerViewModel}"> <TextBlock Text="I''m a Person" /> </DataTemplate> <DataTemplate x:Key="BusinessTemplate" DataType="{x:Type local:ConsumerViewModel}"> <TextBlock Text="I''m a Business" /> </DataTemplate> <DataTemplate DataType="{x:Type local:ConsumerViewModel}"> <ContentControl Content="{Binding }"> <ContentControl.Style> <Style TargetType="{x:Type ContentControl}"> <Setter Property="ContentTemplate" Value="{StaticResource PersonTemplate}" /> <Style.Triggers> <DataTrigger Binding="{Binding ConsumerType}" Value="Business"> <Setter Property="ContentTemplate" Value="{StaticResource BusinessTemplate}" /> </DataTrigger> </Style.Triggers> </Style> </ContentControl.Style> </ContentControl> </DataTemplate>

Un DataTemplateSelector también funcionará, pero solo si la propiedad que determina qué plantilla mostrar no cambia ya que DataTemplateSelectors no responde a las notificaciones de cambios. Por lo general, los evito, si es posible, ya que también prefiero mi lógica de selección de vista en mi vista para poder ver qué está pasando.

Tengo un modelo de vista llamado

ViewModelClass

que contiene un booleano.

Tengo otro modelo de vista que contiene

ObservableCollection<ViewModelClass> m_allProjects;

Entonces tengo esto en mi opinión:

<DataTemplate> <views:ProjectInfoView x:Key="ProjectInfoDetailTemplate"/> </DataTemplate> <ItemsControl Grid.Row="1" Grid.Column="0" ItemsSource="{Binding AllProjects}" ItemTemplate="{StaticResource ProjectInfoDetailTemplate}" Margin="10,28.977,10,10"> </ItemsControl >

Ahora quiero, basado en el valor booleano de la colección AllProjects, usar una plantilla de datos diferente. ¿Cuál es la mejor manera de hacer esto?

Sé que puedo hacer esto con diferentes ViewModels y usar un tipo de objeto ViewModel-base, pero prefiero usar solo 1 modelo de vista.

EDITAR:

Quiero hacer esto con disparadores de datos. ¿Puede alguien proporcionarme algún código por favor?


Si desea cambiar la vista de elementos de control de elementos en el caso del booleano ViewModelClass, simplemente puede usar un estilo de controlador de datos en el control de usuario ProjectInfoView.