[英]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綁定錯誤並不總是最容易閱讀的,但可以用冒號/分號/句號來分解,然后向后閱讀:
可以理解為:
NoTarget
的屬性 <ContentControl>
, Name="HeaderBorder"
DataContext
)類型為FrameViewModel
"Active"
FrameViewModel
上FrameViewModel
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.