2014-09-23 4 views
1

목록의 각 항목에 대해 사용자 정의 컨트롤을 설정하기 위해 INotifyPropertyChanged를 상속받은 complext 개체의 ObservableCollection에 ItemsControl을 반복합니다. ItemsControl에 대한 내 코드는 다음과 같습니다.WPF OnPropertyChanged ItemsControl 내의 사용자 정의 컨트롤

<ItemsControl ItemsSource="{Binding Path=.ViewModel.Objects}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <c:UserControl CurrentData="{Binding}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

바로 지금 사용자 컨트롤이 매우 간단합니다. 그것은 ObservableCollection에서 텍스트를 출력 할 수 있다는 점에서 작동합니다. 아래에 내 코드입니다 :

public static DependencyProperty CurrentDataProperty = DependencyProperty.Register("CurrentData", 
    typeof(MyData), 
    typeof(MyUserControl)); 

public Character CurrentData{ 
    get { 
     return (MyData)GetValue(CurrentDataProperty); 
    } 
    set { 
     SetValue(CurrentDataProperty, value); 
    } 
} 

public MyUserControl() { 
    InitializeComponent(); 
} 

내 문제는 내 CurrentData.OnPropertyChange 이벤트에 대한 이벤트 처리기를 추가 할 수있는 지점이 결코 없다는 것입니다. 내 XAML은 바인딩되지만 좀 더 복잡한 결정을 내릴 수 있기를 원하지만 MyUserControl() 동안 데이터는 null이됩니다. 이러한 이벤트에 핸들러를 바인딩 할 수있는 방법이 있습니까? 아니면이 모든 것을 잘못하고 있습니까?

당신이 당신의 CurrentData 종속성 속성을 등록하고 콜백에서 이벤트 핸들러를 연결 (및 이전 데이터에서 그들을 벗기기) 때 속성 변경 콜백을 지정할 수 있습니다

답변

2

:

public static DependencyProperty CurrentDataProperty = DependencyProperty.Register(
    "CurrentData", 
    typeof(MyData), 
    typeof(MyUserControl), 
    new PropertyMetadata(default(MyData), OnCurrentDataPropertyChanged)); 

private static void OnCurrentDataPropertyChanged(
    DependencyObject d, 
    DependencyPropertyChangedEventArgs e) 
{ 
    var oldData = e.OldValue as MyData; 
    if (oldData != null) 
     /* remove event handler(s) for old data */; 

    var newData = e.NewValue as MyData; 
    if (newData != null) 
     /* add event handler(s) for new data */; 
} 
관련 문제