繁体   English   中英

WPF绑定错误:找不到附加的依赖项属性

[英]WPF Binding error: Attached Dependency Property not found

我正在尝试解决以下一些经常发生的数据绑定错误

System.Windows.Data Error: 40 : BindingExpression path error: 'Active' property not found on 'object' ''FrameViewModel' (HashCode=55649279)'. BindingExpression:Path=Active; DataItem='FrameViewModel' (HashCode=55649279); target element is 'ContentControl' (Name='HeaderBorder'); target property is 'NoTarget' (type 'Object')

我有一个附加的依赖项属性Active

public bool Active
    {
        get
        {
            return (bool)GetValue(ActiveProperty);
        }
        set
        {
            SetValue(ActiveProperty, value);
        }
    }

    public static readonly DependencyProperty ActiveProperty
       = DependencyProperty.RegisterAttached("Active", typeof(bool), typeof(Card));

绑定是在控件模板的主题文件中设置的

<ControlTemplate x:Key="FrameHeader" TargetType="ContentControl">
.....
.....
<ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=Active}" Value="True">
            <Setter TargetName="HeaderBackground" Property="Background" Value="{DynamicResource SelectedHeaderBrush}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=Active}" Value="False">
            <Setter TargetName="HeaderBackground" Property="Background" Value="{DynamicResource HeaderBrush}"/>
        </DataTrigger>
    </ControlTemplate.Triggers>

控件模板用于内容控件,如下所示(在错误中也可以看到)

<ControlTemplate x:Key="Card" TargetType="{x:Type Button}">
    <ContentControl Template="{DynamicResource FrameTemplate}">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <ContentControl Template="{DynamicResource FrameHeader}" Grid.Row="0" x:Name="HeaderBorder" >
                <Border Style="{DynamicResource BorderTop}">
                    <DockPanel>
                        <ContentPresenter x:Name="UpperLeftContent" 
                                          DockPanel.Dock="Left"
                                          Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=icush:Frame},    
                                                               Converter={StaticResource WatchListLockoutTimerVisibilityConverter},    
                                                               Path=UpperLeftContent}" 
                                          Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=icush:Frame},  
                                                            Converter={StaticResource WatchListLockoutTimerConverter},    
                                                            ConverterParameter={StaticResource LockoutTimerRadius},
                                                            Path=UpperLeftContent}"
                                          />
                        <TextBlock x:Name="Header" 
                                   Style="{DynamicResource Header}" 
                                   Text="{Binding Path=Title}" />
                    </DockPanel>
                </Border>
            </ContentControl>
            <ContentControl Template="{DynamicResource FrameBody}" Grid.Row="1" Content="{TemplateBinding Content}"/>
        </Grid>
    </ContentControl>
</ControlTemplate>

我花了很多时间试图弄清DependencyProperty是否丢失了任何东西,或者绑定设置不正确但无济于事。 该应用程序按预期工作,但我正在尝试摆脱此类绑定错误。 如果我删除XML中的绑定,错误就会消失,但这不是我要寻找的解决方案。 绑定可能有问题。

我看过其他几篇文章,阅读了有关依赖属性和绑定的材料和书籍章节,但找不到任何明显的错误。 我什至使用过snoop,但也没有从中获得任何其他信息。 我看过的一些东西如下

BindingExpression路径错误:在“对象”上找不到属性

System.Windows.Data错误:40:BindingExpression路径错误:在对象上找不到属性

WPF错误40 BindingExpression路径错误:在“对象”上找不到属性

http://wpftutorial.net/DependencyProperties.html

http://rachel53461.wordpress.com/2012/07/14/what-is-this-datacontext-you-speak-of/

有没有办法确定在哪里声明/创建WPF绑定?

WPF性能降低-许多DataItem = null绑定警告

关于可能出什么问题以及如何摆脱错误的任何想法?

WPF绑定错误并不总是最容易阅读的,但可以用冒号/分号/句号来分解,然后向后阅读:

  • 目标属性为“ NoTarget”(类型“ Object”)
  • 目标元素是“ ContentControl”(名称=“ HeaderBorder”);
  • DataItem ='FrameViewModel'(HashCode = 55649279);
  • BindingExpression:Path = Active;
  • 在“对象”“ FrameViewModel”(HashCode = 55649279)“上找不到“活动”属性。
  • BindingExpression路径错误:
  • System.Windows.Data错误:40:

可以理解为:

  • 您试图在某个地方绑定名为NoTarget的属性
  • 此属性位于<ContentControl>Name="HeaderBorder"
  • 该UI对象后面的DataItem( DataContext )类型为FrameViewModel
  • 您尝试绑定的属性称为"Active"
  • FrameViewModelFrameViewModel Active属性
  • 其余的东西通常是可忽略的

通常,我建议您在代码中查找类似于以下内容的内容:

<ContentControl Name="HeaderBorder" NoTarget="{Binding Active}" />

这就是您出现此错误消息的地方

但是,在您的情况下,问题属性为NoTarget ,这显然是WPF的一些特殊特性(我一直在学习新东西!)与触发器相关。

Google快速搜索返回了此帖子 ,这表明问题是由于未使用正确的语法绑定到附加属性而引起的。

尝试用括号为您的附加属性编写绑定,如下所示

<DataTrigger Binding="{Binding Path=(local:Card.Active),...

(我不完全确定这是否行得通,因为我认为必须将附加的依赖项属性附加到UI对象,并且将您的属性附加到听起来像数据对象的Card对象。但是我可能错了,或者被误解了您的代码:))

所以这里的问题是,对于附加属性,您需要将附加属性括在括号中,这是我的代码中缺少的内容。 @Rachel指向的帖子中的MSDN 链接提到了此要求。

我也缺少卡类的名称空间前缀。 创建local名称空间前缀后,我将代码更改为以下内容

<DataTrigger Binding="{Binding Path=(local:Card.Active)}" Value="True">
        <Setter TargetName="HeaderBackground" Property="Background" Value="{DynamicResource SelectedHeaderBrush}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=(local:Card.Active)}" Value="False">
        <Setter TargetName="HeaderBackground" Property="Background" Value="{DynamicResource HeaderBrush}"/>
</DataTrigger>    

这就是所需要的!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM