2014-12-16 1 views
1

이렇게 선언 된 DependencyProperty가 있습니다.종속성을 처리하는 방법 이미 등록 된 속성

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

그것은 내가 짓고 있어요 독립의 UserControl의 일부를 형성 (모두가 미래에 나에게 도움이 될 것 때문에 배울 수있는 좋은 방법이기 때문). 컨트롤이 프로젝트에 처음 추가되고 프로젝트가 제대로 실행되면, 그 후에 'ShowHideAddButton'속성이 'MyControl'에 의해 이미 등록되었다는 메시지와 함께 ArguementException을 던집니다.

그래서 종속성 등록을 등록 해제 할 가능성을 찾기 시작했는데 이것이 좋은 생각이 아닌 것처럼 보입니다. 이것으로 두 가지 질문이 생깁니다.

더 명확하게하기 위해 아래의 대답에 비추어 볼 때 종속성 속성과 관련된 전체 코드가 있습니다. Shared 메소드를 생성하면 '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 블록에 문제가되는 줄을 감싸는 것만으로도 충분하지만 문제를 실제로 해결하지 못하거나 처음에 왜 발생했는지 알려주면 충분합니다.

몇 가지 추가 정보 : enter image description here

그것은 별도의 버튼과 텍스트 상자의 숫자로 구성하고,이 문제의 경우에 DependencyProperty에 ShowHideAddButton가 있습니다 :

실제 컨트롤이 달리하지 보인다 DataNavigator 컨트롤의 속성이지만 컨트롤의 AddButton이라는 Button의 표시 여부를 트리거해야합니다. 내 문제는 해당 버튼을 참조하는 방법을 알아 내려고합니다.

감사

+0

아니요. 5 개의 유사한 속성이 있지만 이름이 다릅니다. 코드가 겹쳐서 코드가 중복되지 않도록 확인했습니다. –

답변

4

당신이 (VB.Net에서 공유) 정적한다 선언 된 새로운 종속성 속성 : Public Shared ReadOnly ShowHideAddButtonProperty As DependencyProperty = DependencyProperty.Register("ShowHideAddButton", GetType(Boolean), GetType(DataNavigator), New FrameworkPropertyMetadata(True, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnShowHideAddButtonChanged))) 에 체크 아웃 : DependencyProperty Class

PropertyChangedCallback이 DependencyProperty.Register에 PropertyMetadata로 변경해야 . 그런 다음 OnShowHideAddButtonChanged 메서드의 매개 변수 서명을 (DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs).으로 변경해야합니다. 마지막으로 해당 메서드에서 var control = dependecyObject as YourControl.과 같은 컨트롤에 도달 할 수 있습니다. 따라서 정적 메서드의 인스턴스 필드, 속성 및 메서드에 연결할 수 있습니다.

+0

고마워, 그게 유일한 이유 야? 공유 속성을 만들면 Declarion (AddressOf OnShowHideAddButtonChanged) 부분에서 공유 메서드 나 공유 멤버 initialiser 내에서 클래스의 인스턴스 멤버를 참조 할 수 없다는 내용의 copile 오류가 표시되기 때문에 질문합니다. 클래스의 명시적인 인스턴스. 이것은 일반적으로 도구 상자에서 드래그 될 사용자 정의 컨트롤입니다. 생성자가 있지만 특별히 인스턴스화하는 사람들을 볼 수 있습니다. 명확하게 나는 어딘가에 점을 놓치고있다. 그러나 확실하지 않은 곳. –

+0

예, 해당 Depenecy 속성을 공유하기 때문에 OnShowHideAddButtonChanged 메서드도 공유해야합니다. – MDoobie

+0

글쎄, 당신이 옳았다 고 생각합니다. +1) 그러나 클래스의 다른 부분을 참조하기 때문에 메소드를 공유 할 때 비슷한 오류가 발생합니다. 이것은 DependencyProperty의 원래 선언을 다시 생각해야한다는 것을 의미합니다. 명료하게하기 위해 필자는 원래의 질문에 관련 부분에 대한 모든 코드를 추가했습니다. –