簡體   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