2012-01-11 1 views
1

В настоящее время у меня есть список категорий. Для каждой категории создается шаблон с расширителем и datagrid, который отображает список элементов, связанных с категорией. Моя проблема в том, что если для категории нет элементов, я не хочу, чтобы шаблон был создан для этой категории. В настоящее время я могу получить шаблон, чтобы скрыть, но его оставляя пробел, где шаблон был сделан.как остановить шаблон, создаваемый в определенном состоянии

<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

+0

ах я не думал об этом! благодаря! – emybob

+0

Замечание: я думаю, вы забыли панель (например, StackPanel, см. Мой ответ ниже) вокруг Expander и DataGrid. Я не думаю, что DataTemplate может иметь два визуальных элемента. – Uri

ответ

1

Недавно я обнаружил свойство ItemTemplateSelector из ItemsControl, который позволит вам предоставить другой шаблон данных для каждого элемента в ItemsControl, зависит от того, какой-то логики работает во время выполнения.

Похоже на сеттер, но более изящный.

Сначала определите класс, полученный из DataTemplateSelector. Правильное место для этого - в коде за файлом * .cs (так как это часть представления).

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> 

Лично я считаю этим уборщик подход, чем триггера, хотя логически они очень аналогичный.

Надеюсь, это помогло.