Различные шаблоны представлений/данных на основе переменной-члена

У меня есть модель вида

 ViewModelClass 

в котором содержится булево.

У меня есть другая модель представления, содержащая

ObservableCollection<ViewModelClass> m_allProjects;

Тогда у меня это на мой взгляд:

<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 >

Теперь я хочу, основываясь на булевом в коллекции AllProjects, использовать другую таблицу данных. Каков наилучший способ сделать это?

Я знаю, что могу сделать это с помощью разных ViewModels и использовать своего рода объект ViewModel-base, но я предпочитаю использовать только одну модель представления.

EDIT:

Я хочу сделать это с помощью триггеров данных. Может ли кто-нибудь предоставить мне код, пожалуйста?

Ответы

Ответ 1

Я обычно использую ContentControl для отображения данных и заменяю ContentTemplate в триггере на основе изменяющегося свойства.

Вот пример, который я опубликовал в моем блоге, который свопирует шаблон на основе связанного свойства

<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>

A DataTemplateSelector также будет работать, но только если свойство, которое определяет, какой шаблон показывать, не изменяется, поскольку DataTemplateSelectors не отвечает на уведомления об изменении. Я обычно избегаю их, если это возможно, так как я также предпочитаю свою логику выбора в моем представлении, чтобы я мог видеть, что происходит.

Ответ 2

если вы хотите переключить представление элементов itemscontrol в случае логического представления ViewModelClass, вы можете просто использовать стиль datatrigger в пользовательском управлении ProjectInfoView.