2009-10-20 5 views
0

DependencyPropertys는 기본적으로 양방향 바인딩을 사용합니까? 어떻게 지정하지 않으면?Silverlight/MVVM에서 사용자 정의 데이터 바인딩

물어 이유는 내가 나에게 문제의 원인이되는 다음과 같은 사용자 컨트롤을 가지고있다

...

<UserControl x:Class="SilverlightApplication.UserControls.FormItem_TextBox" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
> 

<StackPanel Style="{StaticResource FormItem_StackPanelStyle}" > 

    <TextBlock x:Name="lbCaption" Style="{StaticResource FormItem_TextBlockStyle}" /> 
    <TextBox x:Name="tbItem" Style="{StaticResource FormItem_TextBoxStyle}" /> 

</StackPanel> 

뒤에 코드가있는 것입니다 ...

public partial class FormItem_TextBox : UserControl 
{ 

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(string), typeof(FormItem_TextBox), new PropertyMetadata(string.Empty, ValueChanged));  
    public static readonly DependencyProperty CaptionProperty = DependencyProperty.Register("Caption", typeof(string), typeof(FormItem_TextBox), new PropertyMetadata(string.Empty, CaptionChanged)); 

    public string Value 
    { 
     get { return (String)GetValue(ValueProperty); } 
     set { SetValue(ValueProperty, value); } 
    } 

    public string Caption 
    { 
     get { return (String)GetValue(CaptionProperty); } 
     set { SetValue(CaptionProperty, value); } 
    } 

    private static void ValueChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    { 
     (source as FormItem_TextBox).tbItem.Text = e.NewValue.ToString(); 
    } 

    private static void CaptionChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) 
    {   
     (source as FormItem_TextBox).lbCaption.Text = e.NewValue.ToString(); 
    } 

    public FormItem_TextBox() 
    { 
     InitializeComponent(); 
    } 

} 

내 페이지에서 이와 같은 컨트롤을 사용합니다 ....

<UC:FormItem_TextBox Caption="First Name: " Value="{Binding Path=FirstName, Mode=TwoWay}" /> 

그러나 텍스트 상자에 대한 업데이트는 모델로 전송되지 않습니다.

이 같은 표준 텍스트 상자를 사용하는 경우

....

<TextBlock Text="Firstname:"/> 
<TextBox Text="{Binding Path=FirstName, Mode=TwoWay}" /> 

그런 다음 두 가지 방법으로 데이터 바인딩은 perfecly 작동합니다. 어떤 아이디어가 내 통제에 문제가 있습니까?

건배,

ETFairfax.

답변

1

사용자 정의 컨트롤에서 텍스트 상자의 값이 업데이트 된시기를 알 수 없습니다. tbItem 텍스트 상자에 TextChanged 이벤트에 대한 이벤트 처리기를 추가 한 다음 새 값으로 Value 속성 값을 설정해야합니다.

+0

Bryant에게 감사드립니다. 나는 그것이 뭔가 같을 것이라고 생각했지만, ValueChanged는 (source as FormItem_TextBox) .tbItem.Text = e.NewValue.ToString(); ... 나는 둥근 고리가 될 것 같은 느낌이 들었다. 내가 무슨 뜻인지 안다면? 어쨌든, 당신이 제안한 것, 그것이 모두 중요합니다! 감사. – ETFairfax

+0

ValueChanged는 VM에서 컨트롤에 이르기까지입니다. TextChanged 핸들러는 다른 방향으로 되돌아 가기위한 것입니다. – Bryant

관련 문제