我有一个按钮,它有四个依赖属性,每个属性代表按钮所处的状态。每个状态的源都是一个图像。我想要实现的是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#代码中完成此任务的方法。但是,如果有人知道,那也是一个非常可接受的解决方案。
答案 0 :(得分:1)
TemplateBinding 只能在ControlTemplate中使用.TemplateBinding用于绑定模板定义中的元素属性。 Setters 不支持TemplateBinding。
TemplateBinding是模板场景绑定的优化形式,类似于使用{Binding RelativeSource = {RelativeSource TemplatedParent}}构造的Binding。
在您的情况下尝试
<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}}"/>