Wpf 如何处理已注册的依赖项属性

Wpf 如何处理已注册的依赖项属性,wpf,vb.net,user-controls,dependency-properties,Wpf,Vb.net,User Controls,Dependency Properties,我有一项财产是这样申报的 Public ReadOnly ShowHideAddButtonProperty As DependencyProperty = DependencyProperty.Register("ShowHideAddButton", GetType(Boolean), GetType(DataNavigator), New FrameworkPropertyMetadata(True, FrameworkPropertyMetadataOptions.Affects

我有一项财产是这样申报的

    Public ReadOnly ShowHideAddButtonProperty As DependencyProperty = DependencyProperty.Register("ShowHideAddButton", GetType(Boolean), GetType(DataNavigator), New FrameworkPropertyMetadata(True, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnShowHideAddButtonChanged)))
它是我正在构建的一个独立用户控件的一部分,这既是因为它在将来对我有用,也是因为它是一种学习的好方法。当控件第一次添加到项目中并运行该项目时,该控件工作正常,随后它抛出ArguementException,并显示一条消息,说明“ShowHideAddButton”属性已由“MyControl”注册

因此,我开始寻找注销dependency属性的可能性,但这似乎不是一个好主意。由此产生了两个问题

为了进一步澄清,根据下面的答案,这里是与dependency属性相关的完整代码。使方法共享会导致“ShowHideAddButton”和“Add”抛出与我对答案的评论中提到的相同的错误

Public Shared ReadOnly ShowHideAddButtonProperty As DependencyProperty = DependencyProperty.Register("ShowHideAddButton", GetType(Boolean), GetType(DataNavigator), New FrameworkPropertyMetadata(True, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnShowHideAddButtonChanged)))

'''////////////////////////////////////////////////////////////////////////////////////////////////////
''' <summary>
''' Gets or sets a value indicating whether the hide add button is shown.
''' </summary>
'''
''' <value> true if show hide add button, false if not. </value>
'''////////////////////////////////////////////////////////////////////////////////////////////////////

<Description("Set the visibility of the Add button on the Navigator Control"), Category("Navigator Buttons Visibility")>
Public Property ShowHideAddButton As Boolean
    Get
        Return CBool(GetValue(ShowHideAddButtonProperty))
    End Get
    Set(ByVal value As Boolean)
        SetValue(ShowHideAddButtonProperty, value)
    End Set
End Property

Private Shared Sub OnShowHideAddButtonChanged()
    If ShowHideAddButton = True Then 'this now throws an error as well as Add below
        Add.Visibility = Windows.Visibility.Visible 'Add being the button whose visibility is to be changed
    Else
        Add.Visibility = Windows.Visibility.Collapsed
    End If

End Sub
1为什么这个错误首先会发生…可能是我的原始代码中的错误,但由于它编译时没有错误,我不确定它可能是什么

2简单地将有问题的行包装在try-Catch块中以捕获有问题的错误就足够了吗?这可能是可行的,但并不能真正解决问题,也不能告诉我为什么会发生错误

其他一些信息:

实际控件看起来与此类似:

它由许多单独的按钮和文本框组成,在这种情况下,DependencyProperty ShowHideAddButton是DataNavigator控件的属性,但它需要触发控件中名为AddButton的按钮的可见性。我的问题是试图找出如何引用该按钮


谢谢

您声明的新依赖属性应在VB.Net中静态共享:公共共享只读显示HidedButtonProperty为DependencyProperty=DependencyProperty.RegisterShowHidedButton、GetTypeBoolean、GetTypeDataNavigator、new FrameworkPropertyMetadataTrue、FrameworkPropertyMetadataOptions.AffectsRender、,OnShowHidedButtonChanged的新属性ChangedCallbackAddress 看看这个:

DependencyProperty.Register中的PropertyChangedCallback需要更改为PropertyMetadata。
然后,OnShowHidedButtonChanged方法的参数签名需要更改为DependencyObject DependencyObject、DependencyPropertyChangedEventArgs。最后,在该方法中,您可以访问您的控件,如以下var control=dependcyObject作为您的控件。因此,您可以访问静态方法中的实例字段、属性和方法。

您声明的新依赖项属性应在VB.Net中静态共享:公共共享ReadOnly ShowHidedButtonProperty作为DependencyProperty=DependencyProperty.RegisterShowHidedButton、GetTypeBoolean、GetTypeDataNavigator、,新建FrameworkPropertyMetadataTrue,FrameworkPropertyMetadataOptions.AffectsRender,新建PropertyChangedCallbackAddressOf OnShowHidedButtonChanged 看看这个:

DependencyProperty.Register中的PropertyChangedCallback需要更改为PropertyMetadata。
然后,OnShowHidedButtonChanged方法的参数签名需要更改为DependencyObject DependencyObject、DependencyPropertyChangedEventArgs。最后,在该方法中,您可以访问您的控件,如以下var control=dependcyObject作为您的控件。因此,您可以访问静态方法中的实例字段、属性和方法。

否。有五个类似的属性,但名称不同,我已经仔细地检查了代码,以确保它不是重复的。否。有五个相似的属性,但名称不同,我已经用一个很好的梳子仔细检查了代码,以确保它不是重复的。谢谢,这是发生这种情况的唯一原因吗?我之所以这样问是因为如果我将其设置为共享属性,那么它会在Declarion AddressOf OnShowHideAddButtonChanged部分下显示一个复制错误,指出在没有类的显式实例的情况下,不能从共享方法或共享成员初始化器中引用类的实例成员。这是一个用户控件,通常会从工具箱中拖出,它有一个构造函数,但我可以看到人们专门实例化它。显然,我在某个地方遗漏了要点,但不确定在哪里。是的,OnShowHidedButtonChanged方法也需要共享,因为它的Dependecy属性是共享的。我认为您是正确的,所以+1在那里,但是在使方法共享时,它会引发类似的错误,因为它引用了类的其他部分。我想这意味着我需要重新考虑从属财产的原始声明。为了清晰起见,我在原始问题中添加了相关部分的所有代码。好吧,据我所知,问题在于HowHideAddButtonChanged方法引用非共享属性ShowHideAddButton。在依赖中
在decyProperty.Register中,应将PropertyChangedCallback更改为PropertyMetadata。我已相应地编辑了答案。@DomSinclair必须共享PropertyChangedCallback方法,但您可以将DependencyObject类型的第一个参数强制转换为控件的当前实例,该实例是设置属性的实例。看,谢谢,这是发生这种情况的唯一原因吗?我之所以这样问是因为如果我将其设置为共享属性,那么它会在Declarion AddressOf OnShowHideAddButtonChanged部分下显示一个复制错误,指出在没有类的显式实例的情况下,不能从共享方法或共享成员初始化器中引用类的实例成员。这是一个用户控件,通常会从工具箱中拖出,它有一个构造函数,但我可以看到人们专门实例化它。显然,我在某个地方遗漏了要点,但不确定在哪里。是的,OnShowHidedButtonChanged方法也需要共享,因为它的Dependecy属性是共享的。我认为您是正确的,所以+1在那里,但是在使方法共享时,它会引发类似的错误,因为它引用了类的其他部分。我想这意味着我需要重新考虑从属财产的原始声明。为了清晰起见,我在原始问题中添加了相关部分的所有代码。好吧,据我所知,问题在于HowHideAddButtonChanged方法引用非共享属性ShowHideAddButton。在DependendeCyproperty.Register中,应将PropertyChangedCallback更改为PropertyMetadata。我已相应地编辑了答案。@DomSinclair必须共享PropertyChangedCallback方法,但您可以将DependencyObject类型的第一个参数强制转换为控件的当前实例,该实例是设置属性的实例。看见