2009-11-09 3 views
0

Window에 표시 할 UserControl이 두 개 있습니다. 첫 번째 UserControl "SelectedItem"속성의 값은 두 번째 UserControl "SelectedItem"속성으로 설정해야합니다. 어떻게해야합니까?WPF의 컨트롤간에 속성 바인딩

현재 코드에서 첫 번째 UserControl의 속성에서 설정된 값은 두 번째 UserControl에서 업데이트를 트리거하지 않습니다. 각각의 usercontrol/window에 대한 모델을 첨부했습니다.

다음은 Window의 코드입니다.

<MyControls:MyFirstUserControl x:Name="m_controlOne" /> 
<MyControls:MySecondUserControl x:Name="m_controlTwo" SelectedItem={Binding Path=SelectedItem, ElementName="m_controlOne" /> 

는 또한 위의 바인딩 구조 UpdateSourceTrigger=PropertyChanged를 추가하려고 시도했지만 아무 소용이있다.

MyFirstUserControl에서 "SelectedItem"이라는 속성과 마찬가지로 MySecondUserControl에 연결된 DependencyProperty을 구현했습니다. 나는 또한 두 UserControls에서 INotifyPropertyChanged를 구현하려고 시도했다. (모델에도 구현되었다.) MyFirstUserControl의 재산의 set { }이, 내가 OnPropertyChanged("SelectedItem"), OnPropertyChanged(new DepedencyPropertyChangedEventArgs(...))뿐만 아니라 SetValue(SelectedItemProperty)를 사용하는 시도에서

, 두 번째 사용자 컨트롤의 selectedItem가 속성에 업데이 트를 실행하는 데 실패 모두.

무엇을 놓치셨습니까?

+0

나는 이것이 일하지 않을 이유를 생각할 수 없다. 더 많은 코드가 문제를 밝혀주는 데 도움이 될까요? – Grokys

+1

@Groky가 말했듯이, SelectedItem 속성에 대한 코드를 보는 것이 도움이 될 것입니다. – Andy

답변

2

몇 가지 문제가 있습니다.

종속성 속성을 사용하는 경우 INotifyPropertyChanged를 구현할 필요가 없습니다.

또한 WPF는 종속성 속성의 설정자를 사용하지 않고 대신 백킹 필드를 직접 설정합니다. 이것이 setter에서 중단 점 설정이 작동하지 않는 이유입니다.

WPF에서 속성을 설정할 때 코드를 실행하려면 속성을 설정할 때마다 실행되는 처리기를 지정할 수있는 Register 메서드의 오버로드가 있습니다.

public static readonly DependencyProperty SelectedItemProperty = 
    DependencyProperty.Register(
     "SelectedItem", typeof(object), typeof(MySecondUserControl), 
     new PropertyMetadata(SelectedItemChanged)); 

private static void SelectedItemChanged(
    DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    MySecondUserControl instance = (MySecondUserControl)d; 
    instance.OnSelectedItemChanged(e); 
} 

protected virtual void OnSelectedItemChanged(
    DependencyPropertyChangedEventArgs e) 
{ 
    // Do code triggered by change here 
} 

마지막으로 바인딩 구문이 올바르지 않습니다 (오타). 당신은 a}을 잃어 버렸고 귀하의 견적은 잘못된 위치에 있습니다. 그것은이어야한다 :

<MyControls:MySecondUserControl 
    x:Name="m_controlTwo" 
    SelectedItem="{Binding Path=SelectedItem, ElementName=m_controlOne}" 
/>