[英]WPF DataTemplate Binding depending on the type of a property
我有一組綁定到分層數據模板的對象,我的每個對象都有一個屬性(我們稱之為屬性“A”)屬於某種類型。 這種類型在每個對象之間變化。
如果數據模板包含圖像和某些文本,那么根據屬性“A”的類型更改模板中顯示的圖像的最佳方法是什么。
我知道我可以把它放到轉換器中並在代碼中手動進行綁定轉換,但是在WPF中提供了所有綁定工具,我認為這可能是更好的方法。
如果您創建本地數據模板並使用ContentPresenter
,則在數據模板中執行此操作非常簡單。 此模板顯示MyObject
類型的對象,顯示一個圖像,其源由TextBlock
旁邊的A
屬性的類型確定,該TextBlock
顯示Text
屬性的內容:
<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(); } }
(當A
的值發生變化時,您還需要為AType
引發PropertyChanged
。)一旦完成此操作,您應該能夠在樣式中實現數據觸發器,例如:
<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>
我想你可以用觸發器做到這一點。
<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>
沒有測試過,但想法就是這樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.