2012-04-17 24 views
15

que tienen un modelo de vista llama/plantilla de datos en base a la variable miembro de

ViewModelClass 

wich contiene un valor lógico.

tengo otro modelo de vista que contiene

ObservableCollection<ViewModelClass> m_allProjects; 

Entonces tengo esto en mi punto de vista:

<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 booleano en el AllProjects-colección, utilizar una diferente datatemplate. ¿Cuál es la mejor manera de hacer esto?

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

EDIT:

quiero hacer esto con disparadores de datos. ¿Alguien puede proporcionarme algún código, por favor?

Respuesta

58

Normalmente utilizo un ContentControl para mostrar los datos y cambio el ContentTemplate en un desencadenador basado en la propiedad que cambia.

He aquí un ejemplo que he publicado en my blog que intercambie una plantilla basada en una propiedad ligada

<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 sólo si la propiedad que determina qué plantilla para mostrar no cambia desde DataTemplateSelectors no responden a las notificaciones de cambio. Usualmente 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.

-1

si desea cambiar la vista de elementos de control de elementos en el caso de ViewModelClass booleano, entonces puede simplemente usar un estilo de disparo de datos en su control de usuario ProjectInfoView.

+0

¿Puede mostrar algún código como ejemplo, por favor? –

Cuestiones relacionadas