使用基于objecttype的不同itemcontainerstyles

use*_*180 1 wpf styles listboxitem

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

ObservableCollection<BaseObject> _baseObjects;
public ObservableCollection<BattlegroundBaseObject> BaseObject
{
    get { return _baseObjects?? (_baseObjects= new ObservableCollection<BaseObject>()); }
} 
Run Code Online (Sandbox Code Playgroud)

该集合有两个来自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>
Run Code Online (Sandbox Code Playgroud)

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

She*_*dan 5

看来,你对错误的想法ItemContainerStyle...的线索是在名字......这是Style容器,而不是为内容.我的意思是,它StyleListBoxItem项目中包含的数据,而不是项目中包含的数据......字面意思是项目的容器.

你真正想要的是DataTemplate你可以为ItemTemplate房产指定的东西.该DataTemplate有一个DataType明确属性,以便您可以采取相关类的属性的优势.您可以使用a 在每个项目的基础上DataTemplateSelector切换DataTemplates,但还有另一种方法.

您可以做的是DataTemplate为每种数据类型指定一个,但不要为它们x:Key赋值.这样,WPF将自动将它们应用于它找到的没有明确设置的任何相关数据类型对象.

<DataTemplate DataType="{x:Type YourXmlNamespacePrefix:SomeDataType}">
    ...
</DataTemplate>
<DataTemplate DataType="{x:Type YourXmlNamespacePrefix:SomeOtherDataType}">
    ...
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

您可以保留ItemContainerStyle空白,也可以定义每个项目的容器外观,无论类型如何.