WPF,无法绑定属性,因为它说它不是DependencyProperty,但我注册了它

我有一个带有Template属性的UserControl ,我将其设置为DependencyProperty

 public partial class TemplateDetail : UserControl { public static readonly DependencyProperty _templateProperty = DependencyProperty.Register( "Template", typeof(Template), typeof(TemplateDetail) ); public TemplateDetail() { InitializeComponent(); Template = new Template(); DataContext = Template; } public Template Template { get { return (Template)GetValue(_templateProperty); } set { SetValue(_templateProperty, value); } } } 

我正在尝试在XAML中使用此UserControl用于Window ,SaveTemplateDialog,并且我正在尝试将其Template属性设置为SaveTemplateDialog类中的Template属性:

  

SaveTemplateDialogDataContext设置为其Template属性,该属性也是依赖属性。 但是,对于上面的XAML, Template="{Binding}"在Visual Studio中以蓝色下划线标出,它表示:

无法在“TemplateDetail”类型的“Template”属性上设置“绑定”。 ‘绑定’只能在DependencyObject的DependencyProperty上设置。

果然,当我加载我的应用程序时, TemplateDetail尝试显示的Template的内容是空白的,当我知道其中有值时。 如果我将TemplateDetail.Template注册为依赖属性,为什么会给出此消息?

编辑:现在我很困惑。 在我的SaveTemplateDialog窗口中,我正在执行以下操作以将模板传递给TemplateDetail UserControl

  

我知道Path=NewTemplate正在获取正确的数据,因为我在SaveTemplateDialog也有这个XAML,它显示了我期望在NewTemplateMyType属性中的NewTemplate

  

TextBlock显示了我的期望。 但是,显然正确的数据没有到达TemplateDetail或者我没有在那里正确绑定,因为我无法在TemplateDetail显示相同的MyType属性(或其他Template属性)。 在TemplateDetail

  

这是现在的TemplateDetail类:

 public partial class TemplateDetail : MainWindowUserControl { public static readonly DependencyProperty TemplateDataProperty = DependencyProperty.Register( "TemplateData", typeof(Template), typeof(TemplateDetail), new PropertyMetadata( new Template("Default Template", null) ) ); public TemplateDetail() { InitializeComponent(); DataContext = this; } public Template TemplateData { get { return (Template)GetValue(TemplateDataProperty); } set { SetValue(TemplateDataProperty, value); } } } 

您应该将DependencyProperty的名称更改为使用PropertyNameProperty之类的标准约定,而不是像字段一样命名。 当您在XAML中设置某些内容时,它会调用SetValue并期望使用字符串名称(此处为“Template”),后跟“Property”来命名该属性。

更新第二个问题:

在TemplateDetail构造函数中设置DataContext = this时,会导致Path = NewTemplate Binding的源从inheritance的DataContext更改为TemplateDetail控件本身。 您应该在“输出”窗口中看到一个错误,即在TemplateDetail类型的对象上找不到NewT​​emplate属性。 我不会重置UserControl本身的DataContext,而是通常在我的UserControl XAML中为根布局面板提供一个x:Name,并在构造函数中设置LayoutRoot.DataContext = this

确保模板不是导致XAML处理器混淆的保留字。 尝试一个不同的词。

(根据Sarah Vessel的建议发布的答案)。

我觉得有些东西没有得到应有的更新。 我发现如果我在SaveTemplateDialog窗口中的NewTemplate属性中执行了以下操作,那么我的TemplateDetail UserControl将正确填写我期望的所有数据:

 public Template NewTemplate { get { return (Template)GetValue(NewTemplateProperty); } set { SetValue(NewTemplateProperty, value); // The magic line, explicitly setting TemplateData property on // the TemplateDetails UserControl: uct_templateDetails.TemplateData = value; } } 

这让我相信只要在SaveTemplateDialog中使用以下内容,XAML就不足以在NewTemplate更新时将新实例发送到TemplateDetails

  

我希望有人能指出我在这里做错了什么,因为我似乎不应该明确地说uct_templateDetails.TemplateData = value; 每当SaveTemplateDialog.NewTemplate被更改时。 我认为这是依赖属性的重点,更新它会导致使用它的东西获得更新的值。