Связывание FocusedElement в HierarchicalDataTemplate - PullRequest
1 голос
/ 16 марта 2011

Я пытаюсь сфокусировать элемент управления в шаблоне HierarchicalDataTemplate.К сожалению, моя попытка привязать элемент управления в шаблоне не удалась.Вот мой код:

        <HierarchicalDataTemplate DataType="{x:Type TreeView_Experiment:BookmarkPage}">
            <DockPanel>
                <ToggleButton ... edited for brevity ... />
                <Controls:EditableTextBlock x:Name="EditBox" Text="{Binding Path=Title}" VerticalAlignment="Center" IsEditable="True" Focusable="True"/>
            </DockPanel>
            <HierarchicalDataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=IsFocused, RelativeSource={RelativeSource AncestorType={x:Type TreeViewItem}}}" Value="true">
                    <!-- The Value binding fails with the error: Cannot find source for binding with reference 'ElementName=EditBox -->
                    <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=EditBox}"/>
                </DataTrigger>
            </HierarchicalDataTemplate.Triggers>
        </HierarchicalDataTemplate>

Триггер срабатывает, когда элемент древовидной структуры получает фокус, но {Binding ElementName = EditBox} завершается с сообщением «Не удается найти источник для привязки со ссылкой» ElementName = EditBox,... "

Как я могу исправить эту привязку?Или есть лучший способ установить фокус элемента управления в HierarchicalDataTemplate?

Заранее благодарен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2012

Вместо того, чтобы смотреть на TreeView и пытаться найти объект для фокусировки, может быть лучше, чтобы TreeViewItem сам фокусировал.

0 голосов
/ 18 марта 2011

Я смог заставить это работать, добавив этот уродливый кусочек кода позади. Присоедините это к измененному выбору вида дерева:

    private void SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        var treeView = sender as TreeView;

        var selectedContainer =
            typeof (TreeView).GetProperty("SelectedContainer", BindingFlags.NonPublic | BindingFlags.Instance).
                GetValue(treeView, null) as TreeViewItem;

        // Find the element we want to focus.
        var focusControl = selectedContainer.FindVisualChild<TextBox>();
        if (focusControl != null)
            focusControl.Focus();
    }

Требуется следующий метод расширения:

    public static T FindVisualChild<T>(this DependencyObject obj) where T : DependencyObject
    {
        var childCount = VisualTreeHelper.GetChildrenCount(obj);
        for (int i = 0; i < childCount; i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);
            if (child != null && child is T)
            {
                return (T)child;
            }

            T childOfChild = FindVisualChild<T>(child);
            if (childOfChild != null)
            {
                return childOfChild;
            }
        }
        return null;
    }
...