2011-09-19 4 views
1

종속성 속성 "텍스트"가 포함 된 사용자 지정 TextBox 컨트롤 (TextBox에서 파생되지는 않음)을 만들었습니다.TwoWay 바인딩에서 소스의 변경 사항을 어떻게 전달합니까?

두 인스턴스를 추가하고 TwoWay 바인딩을 사용하여 내 뷰 모델의 속성에 바인딩했습니다.

내 사용자 지정 TextBox 컨트롤 내에서 변경 내용을보기 모델의 속성에 전파하는 방식으로 Text 속성을 업데이트하려면 어떻게해야합니까?

사용자 지정 컨트롤에 "Text"속성을 설정하면 뷰 모델의 속성을 null로 남겨 두는 바인딩이 바뀝니다.

나는이 간단 할 것이라고 생각했을 것이다 그러나 나는 그것을 (표준 TextBox 컨트롤이 그것을 수행해야합니다!)

건배

하는 방법을 볼 수 없습니다

편집 :

사용자 지정 컨트롤 :

public class SampleCustomControl : CustomControl 
{ 
    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(SampleCustomControl), new PropertyMetadata(null)); 

    public void Update() 
    { 
     // This replaces my binding, I want it to pass the new value 
     // through to the "SomeProperty" two way binding. 
     Text = "some value"; 
    } 

} 

사용법 :

<Controls:SampleCustomControl Text="{Binding SomeProperty, Mode=TwoWay}" /> 
+2

모든 DependencyProperty 업데이트는 바인딩의 변경 이벤트를 트리거하는 장면 뒤에서 SetValue를 통해 수행됩니다. 일반적으로 GetValue/SetValue를 호출하는 DP에 set/get 쌍을 추가했습니다 (사용자가 직접 사용할 수 있음). XAML 및 제어 및 사용 코드가 사소한 것임을 보여 줄 수 있습니까? 텍스트 속성을 설정하면 바인딩이 변경되어서는 안됩니다. –

+0

그 자체가 SetValue 메서드를 호출하는 Text 속성을 설정하고 있는데 바인딩을 대체하고 있습니다. - 설명하기 위해 몇 가지 코드를 추가하겠습니다. –

답변

2

metadata of your dependency property에 속성 변경 콜백을 추가해야합니다.

이 콜백은 Text 속성이 변경 될 때 (양쪽에서) 발생합니다. 여기에서 전달 된 값을 사용하여 텍스트를 표시하기 위해 작성한 사용자 정의 UI를 업데이트 할 수 있습니다.

업데이트 : 이 내용에 대한 의견에 회신하십시오. 예제 코드가 테스트하기에 너무 모호하기 때문에 여기에 문제를 테스트하는 데 사용 된 코드가 있습니다.

public class TestControl : ContentControl 
{ 
    private TextBlock _tb; 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     _tb = new TextBlock(); 
     _tb.Text = Text; 
     this.Content = _tb; 
     _tb.MouseLeftButtonDown += new MouseButtonEventHandler(_tb_MouseLeftButtonDown); 
    } 

    void _tb_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     Update(); 
    } 

    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(TestControl), new PropertyMetadata(string.Empty, OnTextChanged)); 

    public void Update() 
    { 
     // This replaces my binding, I want it to pass the new value 
     // through to the "SomeProperty" two way binding. 
     Text = "some value"; 
    } 

    public static void OnTextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     ((TestControl)sender).UpdateText((string)e.NewValue); 
    } 

    protected void UpdateText(string text) 
    { 
     if (_tb != null) _tb.Text = text; 
    } 
} 

내 양방향 바인딩을 사용하여 내 컨트롤의 Text 속성을 뷰 모델에 바인딩했습니다. 보기에서 텍스트를 클릭하면보기와 뷰 모델 모두 새 텍스트 "일부 값"으로 업데이트됩니다. viewmodel의 값을 업데이트하고 속성이 변경된 이벤트를 발생 시키면 값이 뷰와 컨트롤에서 업데이트되어 바인딩이 여전히 유효합니다.

예를 들어 다른 누락 된 부분이 있어야합니다.

+0

바인딩이 변경되었지만 업데이트 할 때 내 사용자 지정 컨트롤을 업데이트하지 않는 문제가 있습니다. 뷰 모델에의 바인딩을 통과하는 커스텀 컨트롤 내의 값. –

+0

내 답변을 업데이트하여 귀하의 의견을 언급합니다. – Bryant

+0

* 책상에 안타 얼굴 * 당신이 맞아요, 뭔가가 누락되었습니다 - UserControl에 대한 XAML에서 RelativeSource = Self로 컨트롤의 DataContext를 설정 했으므로 Text DP의 TwoWay 바인딩이 시도하고 있음을 의미합니다. ViewModel 대신 컨트롤 자체의 속성에 바인딩합니다. 동작이 훌륭하다고는 확신 할 수 없지만 컨트롤의 루트가 x : Name이고 컨트롤이 UserControl 내에서 ElementName 바인딩을 사용하여 바인딩 된 상태에서 DataContext를 제거했습니다. 모든 작품은 지금. 앞으로는이 모든 것이 명확한 출력 창에 더주의를 기울여야합니다! :) –

-1

바인딩 속성이 TwoWay로 설정되어 있고 getter와 setter가 노출되어있는 경우 TextBox에 입력 한 텍스트가 ViewModel로 전송됩니다. 나는 실제 통제가 당신이 그 통제의 초점을 잃을 때 일어난다 고 믿습니다, 나는 믿습니다.

+0

실제 TextBox를 사용하지 않고 TwoWay 바인딩을 지원할 사용자 지정 컨트롤을 만들었습니다. –

관련 문제