XAML代码重用(布尔到图像绑定)

时间:2010-08-18 02:20:12

标签: wpf xaml binding

我希望能够重用此XAML,而不是制作副本并更改绑定路径。这是什么解决方案?

我想在数据网格中显示一个布尔列的勾号或十字。

<Image>
    <Image.Style>
        <Style TargetType="{x:Type Image}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Status}" Value="False">
                    <Setter Property="Source" Value="Images/cross.png"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Status}" Value="True">
                    <Setter Property="Source" Value="Images/check.png"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
   </Image.Style>
</Image>

2 个答案:

答案 0 :(得分:2)

您可以将一个简单的Bool写入ImageSource转换器,如果转换后的值为false,则返回“false.png”;如果值为true,则返回另一个图像。

答案 1 :(得分:1)

如果绑定来源属性名称不同,请制作UserControlCustomControl or as commanderz wrote, a ValueConverter

以下示例显示如何创建UserControl:

<UserControl ..... />
  <Image> 
    <Image.Style> 
        <Style TargetType="{x:Type Image}"> 
            <Style.Triggers> 
                <DataTrigger Binding="{Binding Status,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" Value="False"> 
                    <Setter Property="Source" Value="Images/cross.png"/> 
                </DataTrigger> 
                <DataTrigger Binding="{Binding Status,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" Value="True"> 
                    <Setter Property="Source" Value="Images/check.png"/> 
                </DataTrigger> 
            </Style.Triggers> 
        </Style> 
   </Image.Style> 
  </Image> 
</UserControl>

在后面的代码中,创建一个依赖项属性Status。

public partial class MyUserControl : UserControl {

    public bool Status {
        get { return (bool)GetValue(StatusProperty); }
        set { SetValue(StatusProperty, value); }
    }
    public static readonly DependencyProperty StatusProperty = DependencyProperty.Register("Status", typeof(bool), typeof(MyUserControl), new UIPropertyMetadata(false));

    public MyUserControl() {
        InitializeComponent();            
    }
}

然后你可以使用用户控件然后绑定到status-property:

<local:MyUserControl Status="{Binding Status}"/>
<local:MyUserControl Status="{Binding AnotherNamedStatusProperty}"/>

如果binding-property的名称始终相同,请声明样式更全局,然后为每个所需的图像设置它。例如。将样式放在Window.Resources - 部分并为其定义一个键(例如YourStyleKey_Style);

<Window.Resources>
    <Style TargetType="{x:Type Image}" x:Key="YourStyleKey_Style"> 
        <Style.Triggers> 
            <DataTrigger Binding="{Binding Status}" Value="False"> 
                <Setter Property="Source" Value="Images/cross.png"/> 
            </DataTrigger> 
            <DataTrigger Binding="{Binding Status}" Value="True"> 
                <Setter Property="Source" Value="Images/check.png"/> 
            </DataTrigger> 
        </Style.Triggers> 
     </Style> 
  </Window.Resources>

在您需要此类图片的xaml中,声明图片并通过Style - 属性设置样式。

  <Image Style="{StaticResource YourStyleKey_Style}"