我遇到了破坏的绑定,通常这种方法工作正常,但现在我无法让它工作。它非常简单,我有一个带椭圆的usercontrol,这个椭圆必须根据boolean类型的DependencyProperty改变颜色。但是它似乎没有找到DependencyProperty。搜索几个小时尝试了不同的这个,但无法让它工作。我想是因为它是星期五?
XAML:
<UserControl
x:Class="NTP_Status"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="100"
d:DesignWidth="100"
mc:Ignorable="d">
<Ellipse
Width="100"
Height="100"
StrokeThickness="2">
<Ellipse.Style>
<Style TargetType="{x:Type Ellipse}">
<Setter Property="Fill" Value="Red" />
<Setter Property="Stroke" Value="Black" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Fill" Value="Orange" />
<Setter Property="Stroke" Value="Navy" />
</Trigger>
<DataTrigger Binding="{Binding Path=IsSyncing, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="Fill" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsSyncing, RelativeSource={RelativeSource Self}}" Value="False">
<Setter Property="Fill" Value="DarkGreen" />
</DataTrigger>
</Style.Triggers>
</Style>
</Ellipse.Style>
</Ellipse>
</UserControl>
VB.net:
Public Class NTP_Status
Private Shared ReadOnly IsSyncingProperty As DependencyProperty = DependencyProperty.Register("IsSyncing", GetType(Boolean), GetType(NTP_Status))
Public Property IsSyncing As Boolean
Get
Return CBool(Me.GetValue(IsSyncingProperty))
End Get
Set(ByVal value As Boolean)
Me.SetValue(IsSyncingProperty, value)
End Set
End Property
End Class
答案 0 :(得分:3)
你有一个Ellipse样式。与{RelativeSource Self}
绑定意味着Binding将尝试在Ellipse对象中查找属性IsSyncing
,因为在UserControl中声明了IsSyncing
,因此失败了。
使用RelativeSource AncestorType
Binding="{Binding Path=IsSyncing, RelativeSource={RelativeSource AncestorType=UserControl}}"
或给UserControl一个名称(x:Name="myControl"
)并使用ElementName:
Binding="{Binding Path=IsSyncing, ElementName=myControl}"
Trigger Property="IsMouseOver" Value="true"
也应该是最后一个,否则IsSyncing的DataTriggers将始终覆盖它
答案 1 :(得分:1)
如果您在Ellipse上使用{RelativeSource Self}
,则Ellipse控件上应该具有 IsSyncing 属性。
当然不是这种情况,我认为您应该使用Path = DataContext 。如果NTP_Status实例是您的DataContext,则为IsSyncing。
最好摆脱那个相对来源并保留现在的绑定路径。
修改强>
我看到我被投票了,我不明白为什么,也许这样做的人可以解释。
请注意,您的Ellipse
将从其父级DataContext
继承UserControl
,因此您不需要在那里使用任何RelativeSource绑定。