WPF绑定到Window属性失败

时间:2011-08-12 17:06:39

标签: wpf binding

我的项目中有一个名为“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属性转换为依赖属性,但它仍然失败。

有没有人知道绑定失败的原因?

由于

2 个答案:

答案 0 :(得分:8)

我认为您需要更改绑定:

{Binding RelativeSource={RelativeSource Self}, Path=Site}

当前绑定不起作用的原因是您尝试从Window中升级层次结构,但实际上您需要Window。

这是一个很好的来源,可以确定绑定字符串应该适用于不同的场景:

http://www.nbdtech.com/Free/WpfBinding.pdf

答案 1 :(得分:0)

DataContext绑定的问题在于该行表示在对象上使用Site属性,该对象是此对象的祖先,类型为Window。由于此对象已经是Window,因此在可视化树的根处,没有祖先可以搜索和查找指定的属性。

为什么不指定构造此对象的DataContext