在'对象'上找不到绑定错误属性

时间:2018-06-08 12:32:19

标签: wpf vb.net xaml dependency-properties

我遇到了破坏的绑定,通常这种方法工作正常,但现在我无法让它工作。它非常简单,我有一个带椭圆的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

2 个答案:

答案 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绑定。