2013-07-05 90 views
1

我处于一个奇怪的情况。我正在生成按特定类别分组的项目列表。在我的视图模型中,我将项存储在ReadOnlyDictionary<string, List<CustomObject>>的实例中,其中CustomObject表示我创建的用于存储每个列表项的类。该字符串是类别。在我看来,我有一个StackPanel其中<ItemsControl>。该项目的控制有一个ItemTemplate这看起来有点像这样:Wpf数据模板 - 如何访问ItemsControl中项目的父项?

<DataTemplate x:Key="DataTemplateName"> 
    <StackPanel> 
     <Separator /> 
     <TextBlock Text="{Binding Key}" /> 
     <ItemsControl ItemsSource="{Binding Value}" /> 
    </StackPanel> 
</DataTemplate> 

的绑定上述工作很大。问题是我不希望第一个项目上面有分隔符。所以我想我需要一个不同的风格的第一个项目。

我试过使用ItemTemplateSelector,但问题是它只能访问当前项目,所以无法知道它是否在第一个元素上。我也试着做一些像

<Separator 
    Visibility={Binding ShowSeparator, RelativeSource={RelativeSource AncestorType={x:Type CustomObject}}}" /> 

...其中ShowCategories在CustomObject类着眼于ReadOnlyDictionary实例,并表示是否要显示分隔依赖项属性。但是当我这样做时,ShowCategories永远不会被访问。我想即使是这样,它也无法知道哪个项目正在调用它。

所以。我该怎么办?

+0

您可以将DataTrigger添加到分隔符样式,如果选择了第一个项目,它将折叠分隔符。 –

回答

0

我会去的MVVM方法:

  1. 有一个CustomObjectViewModel保存在你的字典,而不是你的CustomObject,你CustomObject,因为它的模式

  2. 在CustomObjectViewModel中有权访问CustomObjectService(或为了简单起见,对字典的引用)。

  3. 在提到的服务,也有类似的方法:

    Public Boolean IsCustomObjectFirst(CustomObjectViewModel vm){..}

    这将很明显,检查给定的项目的位置。

  4. 现在只是有一个属性ShouldDisplaySeperatorCustomObjectViewModel,即会得到它的价值从CustomObjectService.IsCustomObjectFirst(this)

  5. 现在只是用它在你的视图的定义,它使用类似于:

    视图定义:

    <DataTemplate x:Key="DataTemplateName"> 
        <StackPanel> 
         <Separator Visibilty="{Binding ShouldDisplaySeperator,Converter={StaticResource BooleanToVisibilityConverter}}" /> 
         <TextBlock Text="{Binding Model.Key}" /> 
         <ItemsControl ItemsSource="{Binding Model.Value}" /> 
        </StackPanel> 
    </DataTemplate> 
    
+0

谢谢!我会试试看! –

+0

没问题,它解决了你的问题吗?或者答案需要调整? –

+0

我只是现在有机会尝试它。我会告诉你。 –

0

您合作如果不需要在虚拟机中添加新的属性或使用ItemTemplateSelector,则可以这样做。

我宁愿把这个单独的XAML,因为它只是查看相关和无关的需要任何逻辑“测试”

因此,一个XAML解决方案是使用ItemsControl.AlternationIndex

东西如:

<ListBox AlternationCount="{Binding RelativeSource={RelativeSource Self}, Path=ItemsSource.Count, Mode=OneWay}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel> 
     <Separator x:Name="seperator" /> 
     <TextBlock Text="{Binding Key}" /> 
     <ItemsControl ItemsSource="{Binding Value}" /> 
     </StackPanel> 
     <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=(ListBox.AlternationIndex), 
             RelativeSource={RelativeSource FindAncestor, 
                     AncestorType={x:Type ListBoxItem}}}" 
         Value="0"> 
      <Setter TargetName="seperator" 
        Property="Visibility" 
        Value="Hidden" /> 
     </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

该片段的两个关键部分。

  • 我们指定的ListBox一样ItemSource.Count,从而生成每个ListBoxItem独特的AlternationIndexAlternationCount
  • DataTemplate.DataTrigger只是检查当前项目,看它是否为AlternationIndex为0,如果是,则隐藏seperator
相关问题