2013-03-08 3 views
2

이것은 매우 이상합니다. 아래의 코드의 요점은 콘텐트를 자식에게 포커스가 주어질 때 콘테이너에 알려주는 attachedProperty를 지원하는 것이다.LogicalTreeHelper.GetChildren - ObservableCollection Move()를 사용하면 DataTemplate에서 ContentControl의 내용이 손실됩니다.

즉 콘텐츠의 텍스트 어딘가에 Grid가 있고 그 중 하나가 포커스를 얻으면 Grid Blue를 켜고 싶습니다.

ItemsTemplate이있는 ListView가 있습니다. ItemsTemplate은 몇 가지를 포함하는 DataTemplate이지만 그 중 하나는 ContentControl입니다.

예 : 해당 UserControl의 특정 타입을 표시한다 ContentControl을 구속

<ListView> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <Grid> 
      <Border> 
      <ContentControl Content="{Binding Something}"/> 
      </Border> 
     </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

. 생성시 ... 정상적으로 작동합니다. 재귀 적으로 그리드 요소로 시작하는 listViewItem의 템플릿을 반복하면 ... ContentControl의 "Content"도 트래버스합니다.

... 한 번 ListView ItemsSource가 바인딩 된 ObservableCollection에서 .Move()를 수행하면 LogicalTreeHelper에 따라 ContentControl.Content가 비어 있습니다.

무엇을 제공합니까?

ContentControl을 검사하면 콘텐츠가 표시되지만 LogicalTreeHelper.GetChildren은 빈 열거자를 반환합니다. 이 경우 될 이유

내가 혼란 스러워요 ...

는 사람이 설명 할 수 있습니까?

LogicalTreeHelper 반복자 방법 여기

당신이 당신의 문제를 해결할 수 어떻게 suggetion입니다

public static void applyFocusNotificationToChildren(DependencyObject parent) 
{ 
    var children = LogicalTreeHelper.GetChildren(parent); 

    foreach (var child in children) 
    { 
    var frameworkElement = child as FrameworkElement; 

    if (frameworkElement == null) 
     continue; 

    Type frameworkType = frameworkElement.GetType(); 

    if (frameworkType == typeof(TextBox) || frameworkType == typeof(ListView) || 
     frameworkType == typeof(ListBox) || frameworkType == typeof(ItemsControl) || 
     frameworkType == typeof(ComboBox) || frameworkType == typeof(CheckBox)) 
    { 
     frameworkElement.GotFocus -= frameworkElement_GotFocus; 
     frameworkElement.GotFocus += frameworkElement_GotFocus; 

     frameworkElement.LostFocus -= frameworkElement_LostFocus; 
     frameworkElement.LostFocus += frameworkElement_LostFocus; 

     // If the child's name is set for search 
    } 

    applyFocusNotificationToChildren(child as DependencyObject); 
    } 
} 

답변

0

알로하 : 내가 바로 GotFocus 이벤트하지만 그것 RoutedEvent 철자 만약 내가 확실하지 않다

은 시각적 트리의 아무 곳에서나 사용할 수 있습니다.

항목 중 하나에 포커스가 있으면 ListView에 알림이 전송되고 핸들러에서 원하는대로 할 수 있습니다. 이것에 대해

방법 :

<ListView GotFocus="OnGotFocus"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <Grid> 
      <Border> 
      <ContentControl Content="{Binding Something}"/> 
      </Border> 
     </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

이것은 당신이 무엇을 할 수 있는지 보여 그냥 어떤 임의의 논리이다.

public void OnGotFocus(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem item = sender as TreeViewItem; 

    if(((MyViewModel)item.Content).SomeColor == "Blue") 
    { 
    Grid g = VisualTreeHelper.GetChild(item, 0) as Grid; 
    g.Background = Colors.Blue; 
    } 
} 

GotFocus는 발생시 시각적 트리를 버블 링하는 RoutedEvent입니다. 어딘가에 이벤트를 잡아서 이벤트를 시작한 원본 소스 객체가 무엇인지 검사합니다. 또는 이벤트를 발생시킨 객체의 ViewModel 속성이 무엇인지 검사합니다.