【问题标题】:using different itemcontainerstyles based on objecttype根据 objecttype 使用不同的 itemcontainerstyles
【发布时间】:2013-11-20 15:14:13
【问题描述】:

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

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>

目前总是采用较低的二传手,但我需要有所不同.. sb 知道怎么做吗?

【问题讨论】:

    标签: wpf styles listboxitem


    【解决方案1】:

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

    您真正要寻找的(似乎)是您可以为ItemTemplate 属性指定的DataTemplateDataTemplate 具有专门的 DataType 属性,以便您可以利用相关类的属性。你可以使用DataTemplateSelectorDataTemplates之间切换,但还有另一种方法。

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

    <DataTemplate DataType="{x:Type YourXmlNamespacePrefix:SomeDataType}">
        ...
    </DataTemplate>
    <DataTemplate DataType="{x:Type YourXmlNamespacePrefix:SomeOtherDataType}">
        ...
    </DataTemplate>
    

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

    【讨论】:

    • 大加这是资源字典的一部分。
    【解决方案2】:
    <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>
    

    【讨论】:

    • 嘿,谢谢你的快速回答,但你能解释一下这条线吗?我不明白:/
    • 该行实际上不会编译。通常,您可以指定 Binding 应该使用整个数据源值而不是该数据源的属性...您可以这样做:Text="{Binding}"。但是,如果语句中有Binding 的其他属性,则必须使用. 字符来指定相同。因此该行应该是这样的:Binding="{Binding ., Converter={StaticResource MyTypeToTemplaceConverter}}"。也可以写成:Binding="{Binding Path=., Converter={StaticResource MyTypeToTemplaceConverter}}".
    • @eranotzap,在我看来,您目前正在尽一切努力获得更多声誉。我的意思是回答所有问题。但是,您对我查看的最后两个问题的回答包含错误,或者根本不工作/编译。也许您应该放慢速度,并在发布答案之前集中精力检查答案?只是一个建议。
    • @Sheridan 这根本不是我正在做的事情,我的一些答案是我在这里写的 psedu 代码,而不是在 vs 中,它们提供了方式,如果有些人不编译因为逗号错过了,读者应该了解它并自行修复。
    • sry 我还是不明白,mytypetotemplaceconverter 到底应该做什么.. :/ sry.. :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    相关资源
    最近更新 更多