我有一個綁定到分層數據模板的對象集合,每個對象都有一個屬性(讓我們稱之爲屬性「A」),它屬於某種類型。這種類型在每個對象中都有所不同。WPF DataTemplate根據屬性的類型進行綁定
如果數據模板包含圖像和某些文本,則根據屬性「A」的類型更改模板中顯示的圖像的最佳方式是什麼。我知道我可以將它粘貼到轉換器中,並在代碼中手動執行綁定轉換,但是通過WPF中提供的所有綁定工具,我認爲這可能是更好的方法。
我有一個綁定到分層數據模板的對象集合,每個對象都有一個屬性(讓我們稱之爲屬性「A」),它屬於某種類型。這種類型在每個對象中都有所不同。WPF DataTemplate根據屬性的類型進行綁定
如果數據模板包含圖像和某些文本,則根據屬性「A」的類型更改模板中顯示的圖像的最佳方式是什麼。我知道我可以將它粘貼到轉換器中,並在代碼中手動執行綁定轉換,但是通過WPF中提供的所有綁定工具,我認爲這可能是更好的方法。
如果您創建本地數據模板並使用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(); } }
(你還需要提高PropertyChanged
爲AType
時A
變化值。)一旦你這樣做,你應該能夠以實現一種風格,例如數據觸發:
<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>
我想你可以用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>
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>
沒有測試它,但這個想法是這樣的。
如果我使用一個數據模板選擇,不會我需要爲每種類型的項目一個新的模板? – gmn 2011-02-15 23:02:31
是的。也許我誤解了你想要做什麼。我編輯了我的答案。 – 2011-02-15 23:05:16