2010-04-28 1 views
5

백업 값을 보유하고있는 사용자 정의 텍스트 상자에 대한 int 종속성 속성이 있습니다. 그것은 int에 바인딩되어 있습니까? 속성을 DataContext에 추가합니다.PropertyChanged가 실행되었지만 소스 값이 변경되지 않은 경우 WPF 종속성 속성 설정자가 실행되지 않음

DataContext에서 PropertyChanged 이벤트를 발생시키고 원본 속성의 값이 변경되지 않으면 (null 상태로 유지) 종속성 속성의 설정자가 시작되지 않습니다.

원본 속성이 동일하게 유지되는 경우에도 PropertyChanged에서 사용자 지정 텍스트 상자 (텍스트 지우기)를 업데이트하려고하기 때문에이 문제가 발생합니다. 그러나, 내가 원하는 (UpdateSourceTrigger 속성이 있지만, 원본이 아닌 대상을 업데이트하려는) 바인딩 옵션을 찾지 못했습니다. 아마도 텍스트 상자에 텍스트를 지워야한다고 알리는 더 좋은 방법이 있습니다. 나는 어떤 제안이든 열어 두었습니다.

private int? _foo; 

    public int? Foo 
    { 
     get 
     { 
      // The binding is working, because _foo is retrieved (hits a breakpoint here). 
      // RaisePropertyChanged("Foo") is called from elsewhere, even if _foo's value is not changed 
      return _foo; 
     } 
     set 
     { 
      // Breakpoint is hit on user input, so the binding is working 
      _foo = value; 
      RaisePropertyChanged("Foo"); 
     } 
    } 

지정 텍스트 상자 (타겟) :

public double? Value 
{ 
    get 
    { 
     return (double?)GetValue(ValueProperty); 
    } 
    set 
    { 
      // When Foo is null and Value is also null, the breakpoint is not hit here 
      SetValue(ValueProperty, value); 

      // This is the piece of code that needs to be run whenever Value is set to null 
      if (value == null && !String.IsNullOrEmpty(Text)) 
      { 
       Text = String.Empty; 
      } 
     } 
    } 

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double?), typeof(CustomTextbox), new PropertyMetadata(null, ValueChangedHandler)); 

    private static void ValueChangedHandler(DependencyObject dependecyObject, DependencyPropertyChangedEventArgs e) 
     { 
      // When Foo is null and Value is also null, the breakpoint is not hit here 
     } 
+1

몇 가지 코드를 게시 할 수 있습니까? 문제를 훨씬 쉽게 이해할 수 있습니다. 얼마나 정확히 DataContext에서 PropertyChanged 이벤트를 발생시키고 있습니까? – wpfwannabe

+0

소스가 같더라도 업데이트해야합니다. 코드를 게시하면 솔루션을 쉽게 찾을 수 있어야합니다. –

+0

일부 코드를 게시했습니다. 애플리케이션이 너무 복잡하여 전체 소스를 여기에 포함 할 수 없습니다. 이름이 바뀌 었습니다. –

답변

16

XAML 대신 호출하는 직접 SetValue 매크로를 호출 요청에 따라,

의 DataContext (소스) (단순화 된)

원본 너의 재산 세터. 정확하게 구체적인 것은 기억이 나지 않지만 얼마 전에 비슷한 문제가 발생했습니다. Value에 대한 setter에 로직을 넣지 말고, Dependency Property가 변경 될 때 콜백을 정의하고 거기에서 값을 업데이트하십시오.

+0

좋아요! 나는 세트에서의 나의 논리가 왜 처형되지 않았는지를보고 있었다. –

+0

+1 - 감사합니다. 발레리, 내 하루를 구했습니다! –