我的项目中有一个名为“CarSystemWindow”的自定义控件类。它来自Window,并有一个自定义模板,为我的应用程序中的所有窗口提供相同的外观。它还定义了两个名为DeviceName和DeviceType的依赖项属性。这些是字符串类型。它们分别默认为“Vehicle:”和“Car 54”。
在我的主程序中,我从数据库中检索一行到View Model对象中,并在程序初始化期间将其保存在名为Site的普通CLR属性中。在MainWindow的xaml中,我有以下代码:
<cs:CarSystemWindow x:Class="....MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:..."
xmlns:cs="..."
Background="Black"
Closed="Window_Closed"
DataContext="{Binding Path=Site, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
DeviceName="{Binding Path=SiteName}"
DeviceType="{Binding Path=SiteTypeName}"
Icon="..."
Height="600"
Loaded="Window_Loaded"
ResizeMode="CanMinimize"
SourceInitialized="Window_SourceInitialized"
Title="Window Title"
Width="800"
WindowStartupLocation="CenterScreen">
在运行时,DataContext属性上的绑定失败,并显示以下消息:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=Site; DataItem=null; target element is 'MainWindow' (Name=''); target property is 'DataContext' (type 'Object')
我在其他地方使用相同的绑定代码并且它可以工作。我甚至将Site属性转换为依赖属性,但它仍然失败。
有没有人知道绑定失败的原因?
由于
贝
答案 0 :(得分:8)
我认为您需要更改绑定:
{Binding RelativeSource={RelativeSource Self}, Path=Site}
当前绑定不起作用的原因是您尝试从Window中升级层次结构,但实际上您需要Window。
这是一个很好的来源,可以确定绑定字符串应该适用于不同的场景:
答案 1 :(得分:0)
DataContext
绑定的问题在于该行表示在对象上使用Site
属性,该对象是此对象的祖先,类型为Window
。由于此对象已经是Window
,因此在可视化树的根处,没有祖先可以搜索和查找指定的属性。
为什么不指定构造此对象的DataContext
?