【发布时间】:2017-03-07 22:47:45
【问题描述】:
我有一个简单的用户控件,其中包含一个图像,我想根据父级(可能是另一个 UC 或窗口)中的属性更改其源。 UC 的简化版本如下所示
<UserControl x:Class="Test.Controls.DualStateButton" ... x:Name="root">
<Grid>
<Image Height="{Binding Height, ElementName=root}" Stretch="Fill" Width="{Binding Width, ElementName=root}">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="{Binding ImageOff, ElementName=root}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="True">
<Setter Property="Source" Value="{Binding ImageOn, ElementName=root}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Grid>
</UserControl>
Height、Width、ImageOff、ImageOn 和 State 都是 UC 上的依赖属性。 UC 没有设置 DataContext,所以它应该继承父级。我正在尝试做的是类似于以下内容,其中 UC 中的 State 绑定到 Window 的 DualState 属性。
<Window x:Class="Test.MainWindow" DataContext="{Binding RelativeSource={RelativeSource Self}}">
...
<Grid>
<local:DualStateButton State="{Binding DualState}" Height="100" ImageOff="{StaticResource ButtonUp}" ImageOn="{StaticResource ButtonDown}" Width="100"/>
</Grid>
</Window>
然而,我得到的是一个错误,指出在“对象”“MainWindow”上找不到“状态”属性,因此它似乎是在字面上采用 UC 中的绑定“状态”而不是将其分配给Window 的 DualState 属性。有人可以了解我做错了什么吗?
如果我通过代码或 XAML(作为布尔值)在 UC 上设置 State 属性,它可以正常工作。状态 DP 定义如下。
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State", typeof(bool), typeof(DualStateButton),
new PropertyMetadata(false));
public bool State
{
get { return (bool)GetValue(StateProperty); }
set { SetValue(StateProperty, value); }
}
它的数据类型是否需要是绑定或其他东西才能使其工作?
【问题讨论】:
-
DualState 属性在哪里? DualState 是 Window 的属性吗?还是它是其他视图模型的属性?
-
查看 FindAncestor
-
是的,DualState 是 window 的一个属性。由于错误说在“对象”“主窗口”上找不到“状态”属性,因此 DataContext 是正确的(即它正在查看窗口)。问题是它正在寻找“状态”而不是“双重状态”
-
当你绑定到 State... 时,它应该如何寻找 DualState?
标签: wpf data-binding