2009-10-30 10 views
7

DataTemplate 내부에서 사용하고있는 사용자 정의 컨트롤이 있습니다.이 UserControl에는 속성 (DependencyProperty로 선언 됨)이 바인딩되어있는 TextBox이 포함되어 있습니다. 데이터 템플릿에서이 속성을 실제 속성 이름 (DependencyProperty)라고 연결합니다. 그것은 제대로 작동, 나는 값을 이름 속성을 할당하는 동안로드 및 내 TextBox 표시, 나는 TextBox에서 값을 변경하고 또한 내 이름 속성을 업데이 트합니다. 종속성 속성에 PropertyChangedEventHandler을 추가하는 동안 문제가 발생했습니다. 유효한 경우 값을 확인하고, 유효하지 않은 경우에는 아무 것도하지 않고 유효하지 않은 경우 이전 값을 할당합니다. 값이 유효하지 않은 경우 이전 값을 할당하면 속성이 업데이트되지만 UserControl의 내 TextBox에 업데이트 된 값이 표시되지 않습니다. 아무도 그 이유를 말할 수 있습니까? 내 UserControlWPF : TextBox 텍스트가 업데이트되지 않습니다.

XAML의 :

<UserControl x:Name="usercontrol"> 
    <StackPanel> 
     <TextBlock ......./> 
     <TextBox Binding={Binding ElementName=usercontrol, Path=Value, Mode=TwoWay}/> 
    </StackPanel> 
</UserControl> 

뒤에 코드에서이있는 DependencyProperty

DataTemplate이 사용하고

:

<HierarchicalDataTemplate DataType="{x:Type myLib:myClass}" ItemsSource="{Binding Children}"> 
    <Expander Header="{Binding}"> 
     <WrapPanel> 
      <edproperty:TextPropertyEditor Caption="Name" Value="{Binding Name, Mode=TwoWay}"/> 
      <edproperty:TextPropertyEditor .................../> 
      <edproperty:TextPropertyEditor .................../> 
      <edproperty:TextPropertyEditor ...................../> 
     </WrapPanel> 
    </Expander> 
</HierarchicalDataTemplate> 

나는이 템플릿 TreeView에서 사용. TreeView 안에 TextBox 값을 입력합니다. UserControl 속성을 업데이트합니다. 속성을 변경합니다. PropertyChangedCallback에 할당합니다. 이름myClass의 속성으로 일부 유효성 검사를 수행하고 OldValue을 재 할당합니다. 유효성 검사가 실패하면. 그것은 차례로 속성을 업데이트하지만 여전히 TextBox이 이전에 입력 한 것과 같은 값을 가지고 있다는 것을 계속보고 있습니다.

public string Name 
    { 
     get 
     { 
      return (string)GetValue(NameProperty); 
     } 
     set 
     { 
      SetValue(NameProperty, value); 
     } 
    } 

    // Using a DependencyProperty as the backing store for Name. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty NameProperty = 
     DependencyProperty.Register("Name", typeof(string), typeof(myClass), new UIPropertyMetadata(null, OnNameChanged)); 

    protected static void OnNameChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args) 
    { 
     if(checkRequired && !IsValid(e.NewValue.ToString())) 
     { 
      checkRequired=false; 
      (sender as myClass).Name = args.OldValue.ToString(); 
     } 
    } 

    private static bool IsValid(string name) 
    { 
     .............some logic here 
    } 
+2

코드를 보지 않고도 적절하게 의견을 말하기는 어려울 것입니다. 코드를 올리실 수 있습니까? –

+0

너무 많아서 게시 할 수 없습니다. 더 자세한 설명이 필요한지 물어볼 수 있습니다. – viky

+2

아니, 당신은 재현 할 최소한의 코드 조각을 쓸 수 있습니다 ... 그렇지 않으면, 우리는 추측, 응답하지 것입니다. 아무도 불확실성을 좋아하지 않습니다. 특히 프로그래머 .. – Anvaka

답변

7

둘러보고의 일 검색 많은 후 난 모든 유효성 검사를 수행하고 이전 값을 할당하고 실행 종속 속성을 업데이트, 내가 UpdateTarget() 메소드를 살았어 필요 후 내 문제

의 해결책을 발견, 업데이트하는 내 TextBox의 값.

이 내가이 질문은 텍스트 상자에 대해 있었는지

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/c404360c-8e31-4a85-9762-0324ed8812ef/

+0

감사합니다! 너는 내 목숨을 구했어 !! –

0

코드 뒤에 직접 속성 값을 설정하면 바인딩이 깨지는 것처럼 보입니다.

그런 식으로 속성을 수정하면 안됩니다. value coercion mechanism을 사용하고 강제 값 콜백의 입력을 확인하십시오.

+0

나는이 방법도 사용하지만 여전히 동일한 문제, 내 텍스트 상자의 가치가 업데이 트되지 않습니다. – viky

+0

내가 새벽에 내 질문을 업데이트했는데 나 한테 제안 해 줄 수있어? 지연에 대한 죄송합니다 – viky

0

아 누락은

내가 여기 확인해야 가정이 많이있다,하지만 난 그것을 기회를 줄 것이다.

당신은 아마 이런 일이 ...

// ... 
public static string GetValue(Dependency obj) 
{ 
    // ... 
} 

// ... 
public static void SetValue(DependencyObject obj, string value) 
{ 
    // ... 
} 

// Using a DependencyProperty as the backing store for Value. This enables animation, styling, binding, etc... 
public static readonly DependencyProperty ValueProperty = 
    DependencyProperty.RegisterAttached("Value", typeof(string), typeof(MyCustomControl), new UIPropertyMetadata(OnValuePropertyChanged)); 

public static void OnValuePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
{ 
    string newValue = e.NewValue as string; 

    // You validate your value here, 
    // Then if fails, revert to old value. 
    if(!SomeCondtion(newValue)) SetValue(obj,e.OldValue as string); 

} 

이 확실히 데이터의 유효성을 검사하는 좋은 방법이 아닙니다. 더 많은 유연성을 제공하는 다른보다 효율적인 접근 방식이 있습니다.

  1. Texbox에 ValidationRule을 적용하십시오.이는 유효성 검사가 실패 할 때 오류를 표시하는 것을 제어 할 수 있기 때문에 첫 번째 권장 사항입니다. 간단한 유효성 검사를 한 후에는 article을 확인하십시오.
  2. TextBox.TextChanged 이벤트를 수신합니다. 이것은 번거롭고 해킹당한 경우 재사용 할 수 없습니다.
  3. DependecyPropertyChanged 콜백 메서드를 사용하지 마십시오. 등록 된 문자열 Property를 사용하고 세터에서 논리를 적용합니다 (예 :

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(string), typeof(UserControlWithTextBox)); 


private string _oldValue; 
public string Value 
{ 
    get { return GetValue(ValueProperty) as string; } 
    set 
    { 
     // Check if the value passes your validation logic 
     if(SomeCondtion(value)) 
     { 
      // If yes, then set the value, and record down the old value. 
      SetValue(ValueProperty, value); 
      _oldValue = value; 
     } 
     else 
     { 
      // Else logic fails, set the value to old value. 
      SetValue(ValueProperty, _oldValue); 
     } 
     // Implement INotifyPropertyChanged to update the TextBox. 
     if(PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("Value")); 
    } 
} 
다시 한번, 당신은 아직도 당신이 좋은 답변을 원하는 경우 다른 사람이 (상관없이 솔루션이 될 수있는 방법 복잡한 귀하의 질문에 대답하지 수 있도록 귀하의 질문에 코드를 표시 할 수 내 대답에서 볼 수 있듯이 , 좋은 질문을하는 노력을 기울일 필요가있다). 내 대답은 당신을 위해 작동하지 않을 수도 있지만 어쩌면 그것은 당신에게 어떤 "인터넷 검색"지시를 줄지도 모릅니다. 희망이 도움이됩니다.

+0

안녕하세요, 내 질문을 업데이 트에 대한 미안 지연 왜 내 텍스트 상자와 함께 일이 무엇입니까? – viky

+0

WPF에서 바인딩이나 설정자 또는 다른 메커니즘을 통해 속성을 업데이트 할 때 예제의 설정에 추가 된 유효성 검사가 수행되지 않습니다. 의존성 프로퍼티를 사용할 때 접근 자나 돌연변이 자에 아무것도 넣지 않는 것이 좋습니다. – jpierson

1

더 나은 솔루션을 설명 것입니다하지만를 RichTextBox 당신이에 UpdateLayout을 사용합니다().

rtb.AppendText("Text"); 
rtb.ScrollToEnd(); 
rtb.UpdateLayout(); 
관련 문제