이것은 매우 이상합니다. 아래의 코드의 요점은 콘텐트를 자식에게 포커스가 주어질 때 콘테이너에 알려주는 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);
}
}