2013-11-20 22 views
1

不同itemcontainerstyles我有一個列表框與收集使用基於OBJECTTYPE

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

收集有兩種不同的兒童BaseObject。一個是另一個的圖像..更多是來

我現在需要根據兒童

<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> 

目前較低的二傳手總是採取兩種不同的ItemContainerStyles的路徑,但我需要它不同..某人知道如何?

回答

5

看來,你對ItemContainerStyle錯誤的想法...的線索是在名字......這是Style容器,不爲內容。我的意思是它Style s ListBoxItem而不是項目中包含的數據......字面上,該項目的容器。

什麼(看起來)你真的要找的是DataTemplate,你可以指定ItemTemplate屬性。 DataTemplate具有DataType屬性,因此您可以利用相關類的屬性。您可能使用DataTemplateSelectorDataTemplate之間切換每個項目的基礎上,但有另一種方法。

你可以做的是爲每個數據類型,你必須指定一個DataTemplate,但不給他們一個x:Key。這樣,WPF將自動將它們應用於任何相關的數據類型對象,它發現它沒有明確設置。

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

您可以離開ItemContainerStyle空,或定義容器將是什麼樣子的每個項目,無論其類型。

+0

大加上這是資源字典的一部分。 –

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> 
+0

嘿感謝您的快速回答,但你能解釋我這一行嗎?我沒有得到它︰/ user3012180

+0

該行不會實際編譯。通常,您可以指定'Binding'應該使用整個數據源值而不是該數據源的屬性......您可以這樣做:'Text =「{Binding}」'。但是,如果在語句中有'Binding'的其他屬性,則必須使用'.'字符來指定相同的。因此,該行應該如下所示:'Binding =「{Binding。,Converter = {StaticResource MyTypeToTemplaceConverter}}」'。它也可以寫成:'Binding =「{Binding Path =。,Converter = {StaticResource MyTypeToTemplaceConverter}}」'。 – Sheridan

+1

@eranotzap,在我看來,你正在盡一切可能獲得更多的聲譽。我的意思是回答所有問題。但是,您對我所查看的最後兩個問題的回答包含錯誤,或者根本不工作/編譯。也許你應該放慢一點,專注於在發佈之前檢查你的答案?只是一個建議。 – Sheridan