2012-04-17 53 views
15

不同視圖/數據模板我有稱爲基於成員變量

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收集在布爾,使用不同的數據模板。做這個的最好方式是什麼?

我知道我可以用不同的ViewModel做這件事,並使用一種ViewModel基礎對象,但我更喜歡只使用1視圖模型。

編輯:

我想用數據觸發器做到這一點。有人可以給我提供一些代碼嗎?

回答

58

我通常使用ContentControl來顯示數據,並在基於更改屬性的觸發器中換出ContentTemplate

這裏是我已經張貼在my blog一個例子交換基於綁定屬性

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

一個DataTemplateSelector還將致力於一個模板,但只有當它決定顯示,因爲不改變它的模板屬性DataTemplateSelectors不響應更改通知。如果可能的話,我通常會避免它們,因爲我更喜歡我的視圖選擇邏輯,因此我可以看到發生了什麼。

-1

如果你想在ViewModelClass布爾值的情況下切換itemscontrol項目視圖,那麼你可以簡單地在你的ProjectInfoView usercontrol中使用一個datatrigger樣式。

+0

你能舉一些例子嗎? – 2012-04-17 14:32:20