2012-01-11 73 views
1

我目前有一個類別列表。對於每個類別,將使用擴展器和數據網格創建一個模板,該擴展器和數據網格將顯示與該類別關聯的項目列表。 我的問題是,如果沒有項目的類別,我不希望爲該類別創建模板。 目前我可以隱藏模板,但它留下了模板製作的空白。如何停止在特定條件下創建模板

<StackPanel Name="CatagoryPanel" Grid.Row="2" Grid.ColumnSpan="6"> 
      <ItemsControl ItemsSource="{Binding Path=CategoryList}"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding Path=Items.Count, UpdateSourceTrigger=PropertyChanged}" Value="0"> 
           <Setter Property="Visibility" Value="Hidden"/> 
           <Setter Property="IsEnabled" Value="False"/> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
         <Expander /> 
         <DataGrid /> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </StackPanel> 
+0

必須嘗試將可見性設置爲摺疊? – Ankesh 2012-01-11 13:33:39

+0

啊我沒想到!謝謝! – emybob 2012-01-11 13:52:11

+0

附註:我想你在Expander和DataGrid周圍忘了一個面板(例如StackPanel,請參閱下面的答案)。我不認爲DataTemplate可以有兩個視覺元素。 – Uri 2012-01-11 14:37:30

回答

1

最近我發現的ItemsControl的ItemTemplateSelector屬性,讓你提供ItemsControl中的每個項目不同的數據模板,依賴於運行時運行的一些邏輯。

與Setter類似,但更優雅。

首先,定義從DataTemplateSelector派生的類。正確的位置是在* .cs文件後面的代碼中(因爲這是View的一部分)。

public class CategoryTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     Category category = item as MusicViewModel.Category; 
     FrameworkElement element = container as FrameworkElement; 

     string key = (category.Count) > 0 ? "Category" : "EmptyCategory"; 
     DataTemplate dt = element.FindResource(key) as DataTemplate; 

     return dt; 
    } 
} 

下一頁您的堆疊面板中,定義了兩個數據模板的資源,以及選擇:

<StackPanel Name="CatagoryPanel" Grid.Row="2" Grid.ColumnSpan="6"> 
    <StackPanel.Resources> 
     <DataTemplate x:Key="EmptyCategory"> 
      <StackPanel><Expander /><DataGrid /></StackPanel> 
     </DataTemplate> 
     <DataTemplate x:Key="Category"> 
      <Expander /> 
     </DataTemplate>     
     <gms:CategoryTemplateSelector x:Key="selector" /> 
    </StackPanel.Resources> 

    <!-- now, define the actual ItemsControl: --> 
    <ItemsControl ItemsSource="{Binding }" ItemTemplateSelector="{StaticResource selector}" /> 

</StackPanel> 

就個人而言,我覺得這種方式更清潔比觸發器,雖然在邏輯上他們是非常類似。

希望這有助於。