2011-02-15 109 views
14

我有一個綁定到分層數據模板的對象集合,每個對象都有一個屬性(讓我們稱之爲屬性「A」),它屬於某種類型。這種類型在每個對象中都有所不同。WPF DataTemplate根據屬性的類型進行綁定

如果數據模板包含圖像和某些文本,則根據屬性「A」的類型更改模板中顯示的圖像的最佳方式是什麼。我知道我可以將它粘貼到轉換器中,並在代碼中手動執行綁定轉換,但是通過WPF中提供的所有綁定工具,我認爲這可能是更好的方法。

回答

31

如果您創建本地數據模板並使用ContentPresenter,在數據模板中執行此操作非常簡單。這個模板呈現MyObject類型的對象,顯示圖像,其來源是由顯示Text屬性的內容旁邊TextBlock類型的A屬性決定:

<DataTemplate DataType="{x:Type MyObject}"> 
    <StackPanel Orientation="Horizontal"> 
     <StackPanel.Resources> 
     <DataTemplate DataType="{x:Type Thing1}"> 
      <Image Source="thing1.png"/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type Thing2}"> 
      <Image Source="thing2.png"/> 
     </DataTemplate> 
     </StackPanel.Resources> 
     <ContentPresenter Content="{Binding A}"/> 
     <TextBlock Text="{Binding Text}"/> 
    </StackPanel> 
</DataTemplate> 

如果要使用樣式做相反,您將遇到問題,因爲數據觸發器想要查看屬性值,並且A屬性的類型本身不作爲屬性公開。

除非,當然,你實現一個:

public Type AType { get { return A.GetType(); } } 

(你還需要提高PropertyChangedATypeA變化值。)一旦你這樣做,你應該能夠以實現一種風格,例如數據觸發:

<Style TargetType="Image"> 
    <Setter Property="Source" Value="default.png"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding AType}" Value="{x:Type Thing1}"> 
     <Setter Property="Source" Value="thing1.png"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding AType}" Value="{x:Type Thing2}"> 
     <Setter Property="Source" Value="thing2.png"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 
1

我想你可以用triggers來做到這一點。

<Image.Style> 
    <Style TargetType="{x:Type Image}"> 
     <Setter Property="Source" Value="Path"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding TheProperty}" Value="TheValue"> 
       <Setter Property="Source" Value="NewPath"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Image.Style> 
+0

如果我使用一個數據模板選擇,不會我需要爲每種類型的項目一個新的模板? – gmn 2011-02-15 23:02:31

+0

是的。也許我誤解了你想要做什麼。我編輯了我的答案。 – 2011-02-15 23:05:16

1

DataTemplateSelector似乎並不在這裏是一個很好的選擇,因爲你必須爲A所有值相同的模板。

使用DataTriggers

<DataTemplate> 
    <StackPanel> 
     <Image x:Name="image" /> 
     <TextBlock>Your text</TextBlock> 
    </StackPanel> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=A}" Value="ValueToCheck1"> 
      <DataTrigger.Setters> 
       <Setter Property="Source" Value="Image1.png" TargetName="image" /> 
      </DataTrigger.Setters> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding Path=A}" Value="ValueToCheck2"> 
      <DataTrigger.Setters> 
       <Setter Property="Source" Value="Image2.png" TargetName="image" /> 
      </DataTrigger.Setters> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

沒有測試它,但這個想法是這樣的。

相關問題