2013-05-15 2 views
4

Windows Store 앱에서 코드 숨김 및 레이아웃 XAML을 캡슐화하고 다시 사용하도록 사용자 정의 컨트롤을 만듭니다. 간단한 사용자 컨트롤은 다음과 같습니다.어떻게 사용자 정의 컨트롤의 속성에 바인딩합니까?

<UserControl> 
    <StackPanel> 
     <TextBlock Text="First Name" /> 
     <TextBox x:Name="MyTextBox" /> 
    </StackPanel> 
</UserControl> 

이제 바인딩을 설정하고 싶습니다. 그래서 UI 컨트롤의 Text 속성을 노출하는 속성으로 코드 숨김을 만듭니다. 이 같은 것 :

public string TextBoxText 
{ 
    get { return MyTextBoxText.Text; } 
    set { MyTextBoxText.Text = value; } 
} 

그러나 이것은 작동하지 않습니다. 사용자 정의 컨트롤에 대한 데이터 바인딩이 XAML UI의 중요한 부분 인 것 같습니다. 그러나 어떻게 완성 되었습니까?

답변

10

소비 페이지에서 바인딩을 지원하는 사용자 정의 컨트롤의 속성 구현은 하나뿐입니다. 그것은 종속성 속성입니다. 구현은 간단하지만 종속성 속성은 컨트롤의 정적 속성이므로 UI와 직접 상호 작용하려면 변경된 이벤트를 포함해야합니다. 이와 같이 :

public string TextBoxText 
{ 
    get { return (string)GetValue(TextBoxTextProperty); } 
    set { SetValue(TextBoxTextProperty, value); } 
} 

public static readonly DependencyProperty TextBoxTextProperty = 
    DependencyProperty.Register("TextBoxText", typeof(string), typeof(MyUserControl), 
    new PropertyMetadata(string.Empty, OnTextBoxTextPropertyChanged)); 

private static void OnTextBoxTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    (d as MyUserControl).MyTextBox.Text = e.NewValue.ToString(); 
} 

나는 인정한다. 이것은 명백하지 않다. 그러나 이제는 아시겠지만 시간이 걸리므로 알아 내려고 노력해야합니다. 다시 말하지만, 사용자 정의 컨트롤의 종속성 속성에만 바인딩 할 수 있습니다. 그리고 변경된 이벤트를 사용하는 정적 스레드에서만 UI 값을 설정할 수 있습니다.

행운을 빈다.

+0

실제 바인딩은 사용자 정의 컨트롤의 부모가 사용자 정의 컨트롤의 속성에 바인딩하는 것입니다. '과 비슷합니다. –

+1

태핑과 같은 이벤트를 ICommand와 어떻게 연결 하시겠습니까? 이렇게? 'public static readonly DependencyProperty LogoutCommandProperty = DependencyProperty.Register ("LogoutCommand", typeof (ICommand), typeof (MyUserControl), null); 개인 무효 PathLogout_Tapped ( 개체를 보낸 사람, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)는 { LogoutCommand .Execute를 (null가)? ' –

0

항상 바인딩에 대해 이야기하지만 실제로 textbox.text 속성을 속성에 바인딩하지 않습니다 (설정 한 경우).

<TextBox x:Name="MyTextBox" **Text="{Binding TextBoxText, Mode=TwoWay}"** /> 

UserControl을 인스턴스에 추가 된 UserControls에게의 DataContext 속성을 설정하는 것을 잊지 마십시오 :

당신은 바인딩 싶어 사용이 방법을 종속성 속성을 작성하고 텍스트 상자의 텍스트 속성을 결합하는 경우

public MyUserControl1() 
{ 
    this.InitializeComponent(); 

    // Set the datacontext to the usercontrol-instance. 
    // If you don't, the binding will use the usercontrol's parent-datacontext. 
    this.DataContext = this; 
} 
+0

그래서, 당신의 접근 방식이 작동하지 않는 이유는의 부모 때문에' user control'은'user control'의'TextBoxText' ** 속성 **에 바인딩되어 있지 않습니다. 그것은'usercontrol'의'TextBoxText' ** 의존성 속성 **에 바인딩되어 있습니다. '사용자 정의'TextBox는 'TextBoxText' 속성에 바인딩됩니다. 그것은 불일치입니다. 결과적으로, 여러분이'TextBoxText' ** 속성 **에서'INotifyPropertyChanged'를 구현했다 할지라도,'TextBoxText' ** 의존성 프로퍼티 **는 이벤트를 발생시키지 않으므로 샘플의 바인딩은 UI. 테스트 해봐. –

+0

얼마나 당황 스럽습니까? 힌트를 주셔서 감사합니다. 나는 단지 그것을 한 방향으로 시험했다! 감사! – Alexander

관련 문제