簡體   English   中英

WPF DataTemplate綁定取決於屬性的類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM