使用依赖项属性在模板中进行条件绑定

时间:2014-07-29 02:14:35

标签: c# wpf binding datatrigger

我有一个按钮,它有四个依赖属性,每个属性代表按钮所处的状态。每个状态的源都是一个图像。我想要实现的是NormalState以外的任何状态都能够绑定到NormalState's值,如果没有提供它自己的值。

我尝试使用DataTrigger来做,但我得到了一个例外:

Set property 'System.Windows.Setter.Value' threw an exception.

它的立场指向这一行:

<Setter Property="MouseOverState" Value="{TemplateBinding NormalState}"/>

以下是XAML代码的一部分,它位于ResourceDictionary

<Style TargetType="{x:Type local:ImageButton}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:ImageButton}">
                    <Grid>
                        <ContentControl>
                            <Grid>
                                <Image x:Name="Normal" Source="{TemplateBinding NormalState}" Visibility="Visible"/>
                                <Image x:Name="MouseOver" Source="{TemplateBinding MouseOverState}" Visibility="Hidden"/>
                                <Image x:Name="Pressed" Source="{TemplateBinding PressedState}" Visibility="Hidden"/>
                                <Image x:Name="Disabled" Source="{TemplateBinding DisabledState}" Visibility="Hidden"/>
                            </Grid>
                        </ContentControl>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=MouseOverState}" Value="{x:Null}">
                            <Setter Property="MouseOverState" Value="{TemplateBinding NormalState}"/>
                            <Setter Property="Width" Value="50"/>
                        </DataTrigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="Normal" Property="Visibility" Value="Hidden"/>
                            <Setter TargetName="MouseOver" Property="Visibility" Value="Visible"/>
                            <Setter TargetName="Pressed" Property="Visibility" Value="Hidden"/>
                            <Setter TargetName="Disabled" Property="Visibility" Value="Hidden"/>
                        </Trigger>

...and so on...

这是使用代码:     

在模板代码中,您可能会注意到Setter Width 50的值ouseOverState。这样做是为了检查该代码是否检测到缺少<Setter TargetName="Normal" Property="Source" Value="{TemplateBinding NormalState}"/> 属性;它确实如此。但是,当我尝试设置MouseOverState属性时,我得到上面描述的Setter Exception。有谁知道我做错了什么或有更简单的方法吗?我无法找到一种方法来使用控件的依赖属性代码中的代码隐藏(依赖代码对所有其他代码来说非常常见,所以我不会在这里发布它,除非它被请求)。< / p>

这是我尝试的另一种方式,但它也不起作用(抛出相同的异常,但不提供大量细节):

{{1}}

经过多次搜索后,我找不到使用Dependency Property setter在C#代码中完成此任务的方法。但是,如果有人知道,那也是一个非常可接受的解决方案。

1 个答案:

答案 0 :(得分:1)

  

TemplateBinding 只能在ControlTemplate中使用.TemplateBinding用于绑定模板定义中的元素属性。 Setters 不支持TemplateBinding。

     
     

TemplateBinding是模板场景绑定的优化形式,类似于使用{Binding RelativeSource = {RelativeSource TemplatedParent}}构造的Binding。

     

访问此link1link2以获取绑定

     
     

在您的情况下尝试

<Setter TargetName="Normal" Property="Source" Value="{Binding Path=Propertyname, RelativeSource={RelativeSource AncestorType={x:Type local:ImageButton}}"/>
     

   <Setter TargetName="Normal" Property="Source" Value="{Binding Path=Propertyname,  RelativeSource={RelativeSource TemplatedParent}}"/>