2012-01-11 7 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

Visibility as Collapsedを設定しようとしましたか? – Ankesh

+0

ああ、私はそれを考えなかった!ありがとう! – emybob

+0

サイドノート:ExpanderとDataGridの周りにパネル(たとえば、StackPanel、私の答えを見てください)を忘れたと思います。私は、DataTemplateが2つの視覚的要素を持つことはできないと思います。 – Uri

答えて

1

最近、私はあなたがItemsControlに内の各アイテムの異なるデータテンプレートを提供してみましょうのItemsControlのItemTemplateSelectorプロパティを発見し、実行時に実行されているいくつかのロジックに依存します。

セッターに似ていますが、よりエレガントです。

まず、DataTemplateSelectorから派生したクラスを定義します。これを行う正しい場所は、* .csファイルのコードの中にあります(これはビューの一部です)。論理的に、彼らは非常にではあるが、個人的に

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

が、私はトリガよりも、このアプローチクリーナーを見つける:次のあなたのスタックパネル内

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

、リソースなどの2つのデータテンプレートと同様に、セレクタを定義します類似。

これが役に立った。

関連する問題