我在这里看到的是你的窗口的类名是Main,你已经向它添加了一个RecordProp 属性,并且你现在正试图绑定到IsChecked 属性名为 RecordProp 的元素。我认为您对名称的工作方式有些困惑。
将x:Name 属性添加到 XAML 元素会在窗口类中使用该名称创建一个字段。这允许您在代码中引用命名元素,并且可能让您认为绑定可以做同样的事情。
但这不是绑定找到命名元素的方式。 x:Name 属性 also 采用 XAML 元素创建的对象,并在窗口的名称范围内以该名称注册它。 (参见MSDN's article on XAML namescopes.)这就是绑定用来解析元素名称的方法。由于您从未将对象添加到名称范围,因此无法在绑定上设置 ElementName 属性。
您可以做几件事。如果你真的想绑定到窗口的某个属性,你可以给窗口一个名字,然后使用属性路径绑定到该属性:
<Window x:Name="MainWindow" x:Class="Main">
...
<customcontrol Name="View" IsChecked="
{Binding ElementName=MainWindow,
Path=RecordProp.IsViewChecked}" />
更简单的是在构造函数中设置数据上下文:
DataContext = this;
完成此操作后,您可以像这样绑定到RecordProp 属性(以及窗口的任何其他属性):
<customControl Name="View" IsChecked={Binding RecordProp.IsChecked}/>
当然,如果您需要将窗口的数据上下文设置为其他内容,这将不起作用。
另一种可能性是像这样实现属性:
public Record RecordProp
{
get { return (Record)Resources["RecordProp"]; }
set { Resources["RecordProp"] = value; }
}
您可以使用(例如)Binding {DynamicResource RecordProp}, Path=IsChecked" 绑定到此。因为它是一个动态资源,如果窗口外部的东西设置了窗口的RecordProp 属性,它的绑定将会刷新——如果你只是将RecordProp 设置为一个属性就不会发生这种情况(除非你实现更改通知)。