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
属性:
SaveTemplateDialog
的DataContext
设置为其Template
属性,该属性也是依赖属性。 但是,对于上面的XAML, Template="{Binding}"
在Visual Studio中以蓝色下划线标出,它表示:
无法在“TemplateDetail”类型的“Template”属性上设置“绑定”。 ‘绑定’只能在DependencyObject的DependencyProperty上设置。
果然,当我加载我的应用程序时, TemplateDetail
尝试显示的Template
的内容是空白的,当我知道其中有值时。 如果我将TemplateDetail.Template
注册为依赖属性,为什么会给出此消息?
编辑:现在我很困惑。 在我的SaveTemplateDialog
窗口中,我正在执行以下操作以将模板传递给TemplateDetail
UserControl
:
我知道Path=NewTemplate
正在获取正确的数据,因为我在SaveTemplateDialog
也有这个XAML,它显示了我期望在NewTemplate
的MyType
属性中的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类型的对象上找不到NewTemplate属性。 我不会重置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
被更改时。 我认为这是依赖属性的重点,更新它会导致使用它的东西获得更新的值。