2016-06-28 4 views
0

는 I 값들의 주어진 세트에 대해 크기 (폭)을 설명하는 속성 RangeSliderModel 클래스를 사용하여 RangeSlider의 동작을 모델링 할.DependencyProperty 및 DataBinding - UserControl이로드 될 때 속성 설정 기가 호출되지 않는 이유는 무엇입니까?

다음, 나는 위치와 크기 일부 사각형의 이러한 속성을 표현해야하고, Thumb의 어떤 경우 어떤에서 DragDelta 사건이 사각형의 크기를 조정하고 RangeSliderModel에 대한 새 값의 계산을 가능하게하는 데 사용되는의 UserControl을 생성 . 마침내

이 UserControl을 유형 RangeSliderModelDependencyProperty 있습니다

public RangeSliderModel Model 
    { 
     get 
     { 
      return (RangeSliderModel)GetValue(RangeSliderModelProperty); 
      // or instead calculate a RangeSliderModel from children sizes. 
     } 
     set 
     { 
      // this IS NOT called when UserControl loads 
      SetValue(RangeSliderModelProperty, value); 
      // here I could take the value and calculate new sizes for the children. 
     } 
    } 

    public static readonly DependencyProperty RangeSliderModelProperty = 
     DependencyProperty.Register("RangeSliderModel", 
            typeof(RangeSliderModel), 
            typeof(MyUserControl), 
            new PropertyMetadata(ModelPropertyChanged)); 

    private static void ModelPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     // this IS called when UserControl loads. 
     RangeSliderModel model = e.NewValue as RangeSliderModel; 
    } 

나는 SetValueGetValue 속성을 오버라이드 (override) 할 것으로 예상 되었으나, 내가 뷰 모델에 해당하는 소스이 DependencyProperty에 바인딩도, 세터 절대로 불리지 않는다! 난 그냥 GetValueSetValue ValueConverter와 유사한 방법으로 사용 기다리고 있었다 - 그리고 나는 아주 PropertyChangedHandler가 대신 호출, 그리고 훨씬 덜 나는이 정보로 무엇을해야하는 이유를 이해할 수 없다. 당신이 바인딩을 통해 설정할 때

+0

이 코드는 RangeSliderModel로 myObject.Model = e.NewValue을해야합니다. – user2880486

답변

1

종속성 속성이 그런 식으로 작동하지 않습니다. DependencyObject.SetCurrentValue이라고합니다. 바인딩은 (본질적으로) 호출 : 그래서

yourObject.SetCurrentValue(YourClassName.RangeSliderModelProperty, someValue); 

, 그래, SetCurrentValue vs SetValue을. SetValue은 종속성 속성의 모든 바인딩을 덮어 씁니다. SetCurrentValue하지 않습니다. IIRC는 XAML의 스타일 트리거가 특성에 의해 설정된 값을 재정의 할 수없는 방식과 관련이 있습니다. 다행스럽게도 여기에서하는 일과 직접적인 관련이 없습니다.

결론은 당신이 때 값이 변경 전화를받을 필요가 코드를 넣어 어디 ModelPropertyChanged 핸들러는 것입니다. 종속성 속성과 일반 .NET CLR 속성은 두 가지 독립적 인 메커니즘입니다.

내가 완전히 공공 재산을 방치하면 종속성 속성 XAML에서 제대로 결합 있었다

; 방금 테스트를 다시 한 번 해보았습니다. 의견에서 당신은 당신이 당신의 코드에 해당되는 것을 발견하지 못했다고 언급 했으므로, 나는 더 많은 독서를 할 필요가있다. 당신은 서브 클래스가 변화에 대응이 필요한 경우

, 당신은 무시할 수있는 가상 메소드를 작성하고, ModelPropertyChanged에 전화하거나 그 밖에 ModelChanged 이벤트를 작성하고 ModelPropertyChanged에 그를 제기 할 수 있습니다.

그들은 DependencyPropertyDescriptor를 통해 ValueChanged 처리기를 추가 할 수 있지만, 그들에게 가상 메서드 또는 이벤트를 작성하여, 어떻게에 인터넷 검색의 수고를 아끼지 당신의 이웃 잘 될 것입니다. 당신의 ModelPropertyChanged 처리기에서

+0

좋아, 나는 SetValue를 보통의 setter 대신 직접 사용하기 시작했다. 반면에, 일반 setter/getter를 삭제하면 XAML 바인딩이 깨져 버렸기 때문에 (주어진 속성 이름이 필요할 것으로 짐작된다.) 그렇게하자. 이제 상황이 예상대로 진행됩니다. 감사합니다. – heltonbiker

+0

@heltonbiker 흠! 그것을 시험하게하고 내가 헛소리를 내뿜지 않도록하십시오. 감사! –

+0

사실, SetValue를 호출하지 않고 SetBinding을 호출합니다. –