2016-07-08 2 views
0

DependencyProperty으로 사용자 정의 컨트롤에 일부 논리를 추가해야합니다. 내 논리가 내 UserControl 안에있는 컨트롤의 속성을 변경해야합니다.DependencyProperty로 제어 할 논리 추가

많은 사용자 컨트롤이 있기 때문에 거대한 "종속성 트리"를 작성하는 것을 피하고 싶습니다. 난 그냥 내 창 (중첩 된 사용자 컨트롤)에서 바인딩을 사용하고 싶습니다.

이 내 컨트롤입니다 :

public partial class BucketElevatorControl : UserControl 
{ 
    public BucketElevatorControl() 
    { 
     InitializeComponent(); 
    } 

    public bool On 
    { 
     get 
     { 
      return (bool)GetValue(OnProperty); 
     } 
     set 
     { 
      SetValue(OnProperty, value); 
     } 
    } 

    // Using a DependencyProperty as the backing store for IsOn. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty OnProperty = DependencyProperty.Register(
      "On", 
      typeof(bool), 
      typeof(BucketElevatorControl), 
      new PropertyMetadata(
       false, PropertyChangedCallback 
       )); 



    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     // I want to do something with my UserControl child controls 
    } 
} 

질문입니다 : 어떻게 뒤에 contol 코드에서 몇 가지 논리를 수행하고 데이터 바인딩을 활용할 수 있습니까?

논리가 복잡합니다 (그림 그래픽, 애니메이션 등).

+1

그리고 질문은 ...? – mechanic

+1

불명확 한 질문입니다! 간단한 언어로 작업을 하나씩 작성하십시오. – AnjumSKhan

답변

1

변경하려는 속성에 대해 CoerceValueCallbacks을 만들어야합니다. 이러한 콜백은 새 값을 설정합니다.

private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 

{ 
    dependencyObject.CoerceValue(MinReadingProperty); 
    dependencyObject.CoerceValue(MaxReadingProperty); 
} 
0

난 당신이 "종속성 트리"에 의해 무슨 뜻인지 모르겠지만, 당신이 변화에 따라 템플릿에 물건의 상태를 변경하려면이 속성 변경, 당신은 다음 다른 사람과 같이 강요하는 경우 컨트롤의 종속성 속성에서 TemplateBinding 및/또는 컨트롤 템플릿의 트리거를 사용하여이 작업을 수행 할 수 있습니다. 필요한 경우 value converters을 작성하십시오. 당신이해야 할 일의 대부분은 아마 그렇게 할 수 있습니다.

더 복잡한 논리가 필요한 경우 컨트롤에서 OnApplyTemplate()을 재정의하고 GetTemplateChild()을 호출하여 컨트롤 템플릿 내에서 명명 된 컨트롤을 가져올 수 있습니다. 예를 들어 PART_FooText이라는 템플릿을 템플릿에 TextBox으로 지정해야 할 수 있습니다. nullGetTemplateChild("PART_FooText") as TextBox에서 가져 오면 예외가 발생합니다. TextBox이 있으면 여기에서 원하는대로 처리하십시오. 이벤트 처리, 속성 설정 등. 원할 경우, 개인 필드 TextBox _PART_FooText;을 나중에 속성 변경 콜백, 다른 이벤트 등에서 도비로 처리하십시오.