2009-07-28 5 views
3

저는 WPF에 상당히 익숙하며 원하는대로 작동하도록 데이터 바인딩을 얻는 데 몇 가지 문제가 있습니다. TextBox를 포함하는 사용자 정의 컨트롤을 작성했습니다.이 TextBox는 다른 사용자에게 다시 바인딩하려는 UserControl의 속성에 바인딩하려고합니다.WPF에서 사용자 정의 컨트롤을 사용하여 데이터 바인딩을 수행하는 방법은 무엇입니까?

무엇이 누락 되었습니까?

XAML

<!-- User Control --> 
<TextBox Text="{Binding Path=TheText}" /> 

<!-- Window --> 
<WpfApplication1:SomeControl TheText="{Binding Path=MyStringProp}" /> 

C#을

// User Control ---- 

public partial class SomeControl : UserControl 
{ 
    public DependencyProperty TheTextProperty = DependencyProperty 
     .Register("TheText", typeof (string), typeof (SomeControl)); 

    public string TheText 
    { 
     get 
     { 
      return (string)GetValue(TheTextProperty); 
     } 
     set 
     { 
      SetValue(TheTextProperty, value); 
     } 
    } 

    public SomeControl() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 
} 

// Window ---- 

public partial class Window1 : Window 
{ 
    private readonly MyClass _myClass; 

    public Window1() 
    { 
     InitializeComponent(); 

     _myClass = new MyClass(); 
     _myClass.MyStringProp = "Hallo Welt"; 

     DataContext = _myClass; 
    } 
} 

public class MyClass// : DependencyObject 
{ 
// public static DependencyProperty MyStringPropProperty = DependencyProperty 
//  .Register("MyStringProp", typeof (string), typeof (MyClass)); 

    public string MyStringProp { get; set; } 
// { 
//  get { return (string)GetValue(MyStringPropProperty); } 
//  set { SetValue(MyStringPropProperty, value); } 
// } 
} 

안부
올리버 Hanappi

PS : 나는 내 사용자 컨트롤의에서 INotifyPropertyChanged 인터페이스를 구현하려고했지만 도움이되지 않았다.

답변

2

TextBox의 Text 속성을 UserControl의 TheText 속성에 다시 바인딩하고 싶습니다. 맞습니까? 그래서 재산이 어디에 사는지 구속력을 말해야합니다. 이 (당신이 FindAncestor를 사용하여 RelativeSource와 함께 할 수있는)이 작업을 수행하는 몇 가지 방법입니다 있지만 가장 쉬운 방법은 XAML에 UserControl을에게 "이름"을주고 바인딩 요소를 사용하여 바인딩하는 것입니다 : 이제

<UserControl ... 
    x:Name="me" /> 
    <TextBox Text="{Binding TheText,ElementName=me}" /> 
</UserControl> 

당신의 TextBox는 "SomeControl.TheText"속성에 할당 (또는 바운드) 한 값을 반영합니다. 다른 코드를 변경할 필요는 없습니다. 기본 MyClass 객체에 INotifyPropertyChanged를 구현하여 바인딩은 속성이 변경된시기를 알고 있습니다.

+0

UserControl의 DataContext를 생성자에 'this'로 설정하고 있으므로 Binding은 어떤 속성을 의미하는지 알고 있습니다. 텍스트 상자의 값을 또한 UserControl의 속성에 올바르게 바인딩되어 있지만 databinding 내 Windows 손실 된 것으로 보인다. –

+0

아 맞습니다 - 예, 사람들이 그것을 시도하는 것을 보았습니다. 윈도우 레벨에서 바인딩을 혼란스럽게 만드는 것 같습니다. Element Binding을 사용하면이를 방지 할 필요가 없습니다. –

+0

좋아, 이제 해결했다. 문제는 제 윈도우에서 바인딩 모드를 TwoWay로 설정해야한다는 것입니다. 도와 줘서 고마워! –

1

매트가 문제의 해결책을 제공했습니다. 앞으로이 문제를 막기위한 설명과 힌트가 있습니다. SomeControl.DataContext으로

에서, SomeControl 생성자에 설정되어있는 윈도우의 유형 SomeControlSource, 당신은하지 MyClass 구성 TheText="{Binding Path=MyStringProp}"를 바인딩이있다.

런타임에 바인딩이 실패하면 디버그 메시지가 Visual Studio의 출력 패널에 기록됩니다. 이 경우 'SomeControl'유형의 객체에 'MyStringProp'속성이 존재하지 않는다는 것을 알았을 것입니다.

모든 사람들이 WPF 데이터 바인딩을 배우고 특히 디버깅하는 데 시간이 걸린다는 것을 알게 되겠지만 인내합니다. WPF에서의 데이터 바인딩은 정말 환상적입니다. UI를 통해 데이터를 얼마나 쉽게 업데이트 할 수 있는지 알 수 있습니다.

+0

조언 해 주셔서 감사합니다.) –

관련 문제