使用基于objecttype的不同itemcontainerstyles

时间:2013-11-20 15:14:13

标签: wpf styles listboxitem

我有一个带有集合的列表框

ObservableCollection<BaseObject> _baseObjects;
public ObservableCollection<BattlegroundBaseObject> BaseObject
{
    get { return _baseObjects?? (_baseObjects= new ObservableCollection<BaseObject>()); }
} 

该集合有两个与BaseObject不同的子节点。一个是另一个图像的路径..更多即将到来

我现在需要基于孩子们的两个不同的ItemContainerStyles

<ListBox.ItemContainerStyle>

     <Style BasedOn="ListBoxItem" TargetType="ListBoxItem"  x:Name="ListBoxPathLineStyle">
        <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="ListBoxItem">
                     <Path Stroke="{Binding ObjectColor}" Data="{Binding PathGeometryData}" />                        
               </ControlTemplate>
             </Setter.Value>
      </Setter>

       <!-- Alternative Template for other type -->
      <Setter Property="Template">
           <Setter.Value>
               <ControlTemplate TargetType="ListBoxItem">
                   <Image Source="howTheHellCares.png"/>                                           
               </ControlTemplate>
           </Setter.Value>
      </Setter>               
   </Style> 
</ListBox.ItemContainerStyle>

目前总是选择较低的二传手,但我需要区别对待...某人知道怎么做?

2 个答案:

答案 0 :(得分:5)

您似乎对ItemContainerStyle有错误的想法......名称中的线索...... 容器的Style,而不是对于内容。我的意思是它StyleListBoxItem而不是项目中包含的数据......字面意思是项目的容器。

您真正想要的是DataTemplate可以为ItemTemplate属性指定的DataTemplateDataType具有DataTemplate属性,以便您可以利用相关类的属性。您可以使用DataTemplateSelector在每个项目的DataTemplate之间切换,但还有另一种方式。

您可以为您拥有的每种数据类型指定x:Key,但不会为其提供<DataTemplate DataType="{x:Type YourXmlNamespacePrefix:SomeDataType}"> ... </DataTemplate> <DataTemplate DataType="{x:Type YourXmlNamespacePrefix:SomeOtherDataType}"> ... </DataTemplate> 。这样,WPF会自动将它们应用于它找到的没有明确设置的任何相关数据类型对象。

ItemContainerStyle

您可以将{{1}}留空,也可以定义每个项目的容器外观,无论其类型如何。

答案 1 :(得分:0)

<ListBox.ItemContainerStyle>

     <Style BasedOn="ListBoxItem" TargetType="ListBoxItem"  x:Name="ListBoxPathLineStyle">
        <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="ListBoxItem">
                     <Path Stroke="{Binding ObjectColor}" Data="{Binding PathGeometryData}" />                        
               </ControlTemplate>
             </Setter.Value>
      </Setter>

      <Style.Triggers>
          <DataTrigger Binding={Binding Path=., Converter={StaticResource MyTypeToTemplaceConverter}} Value="True">
                <Setter Property="Template">
                    <Setter.Value>                                                                
                        <ControlTemplate TargetType="ListBoxItem">
                            <Image Source="howTheHellCares.png"/>                                           
                        </ControlTemplate>                        
                    </Setter.Value>
                </Setter>  
           </DataTTrigger>
      </Style.Triggers>   
    </Style> 
</ListBox.ItemContainerStyle>