Как TAB через ListView с TextBoxes как TreeViewItems? - PullRequest
8 голосов
/ 11 августа 2011

Так что у меня в основном есть этот ListView, и я хотел бы нажать Tab и перебрать мои TreeViewItems (желательно только мои TextBoxes)

<ListView>
    <ListView.View>
        <GridView>
            <GridViewColumn  Header="number"  />
            <GridViewColumn Header="Selector">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox Text="{Binding SelectorName}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

Сценарий, который я вижу, происходит после нажатия вкладки для первоговремя выбора всего первого TreeViewItem и повторного нажатия клавиши Tab, когда выбирается первый TextBox. Наконец, третий TAB выходит из TreeView к следующему элементу управления, хотя есть еще несколько элементов TextBox, которые я хотел бы перехватить, прежде чем переходить к следующему элементу управления,Thankx

Редактировать: Здесь был дан ответ на вопрос: Как вкладывать текстовые поля в ListView

Ответы [ 3 ]

5 голосов
/ 11 августа 2011
2 голосов
/ 11 августа 2011

Возможно, я что-то упускаю, но я не могу найти какой-либо простой способ сделать это, вот краткое описание того, что вы могли бы сделать:

<ListView.InputBindings>
    <KeyBinding Key="Tab" Command="{Binding GoToNextItem}"
            CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}}" />
    <KeyBinding Modifiers="Shift" Key="Tab" Command="{Binding GoToPreviousItem}"
            CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}}" />
</ListView.InputBindings>
<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <EventSetter Event="Selected" Handler="ItemSelected" />
    </Style>
</ListView.ItemContainerStyle>
<ListView.View>
    <GridView>
        <GridViewColumn  Header="number"  />
        <GridViewColumn Header="Selector">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <TextBox Name="_tb" Text="{Binding SelectorName}"/>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView>
</ListView.View>

То, что я сделал здесь:

  • Переопределить поведение вкладки для запуска команд для выбора другого элемента
  • Добавить обработчик события к выбранному событию, чтобы сфокусировать TextBox
  • Имя TextBox, чтобы его можно было найти и сфокусировать

Код:

private readonly ICommand _GoToNextItem = new Command((p) =>
    {
        var lv = p as ListView;
        if (lv.SelectedIndex == -1 || lv.SelectedIndex == lv.Items.Count - 1)
        {
            lv.SelectedIndex = 0;
        }
        else
        {
            lv.SelectedIndex++;
        }
    });
public ICommand GoToNextItem { get { return _GoToNextItem; } }

private readonly ICommand _GoToPreviousItem = new Command((p) =>
{
    var lv = p as ListView;
    if (lv.SelectedIndex <= 0)
    {
        lv.SelectedIndex = lv.Items.Count - 1;
    }
    else
    {
        lv.SelectedIndex--;
    }
});
public ICommand GoToPreviousItem { get { return _GoToPreviousItem; } }
private void ItemSelected(object sender, RoutedEventArgs e)
{
    var item = sender as ListBoxItem;
    (FindNamedChild(item, "_tb") as TextBox).Focus();
}

public static object FindNamedChild(DependencyObject container, string name)
{
    if (container is FrameworkElement)
    {
        if ((container as FrameworkElement).Name == name) return container;
    }
    var ccount = VisualTreeHelper.GetChildrenCount(container);
    for (int i = 0; i < ccount; i++)
    {
        var child = VisualTreeHelper.GetChild(container, i);
        var target = FindNamedChild(child, name);
        if (target != null)
        {
            return target;
        }
    }
    return null;
}

Это очень схематично, используйте любую часть на свой страх и риск.( Фокусировку также можно было бы сделать по-другому, не привлекая выделение к этому, я думаю )

( Класс Command - это просто общая реализация ICommand, которая требуетлямбда, которая выполняется в методе Execute интерфейса )

0 голосов
/ 11 августа 2011

Set IsTabStop = "False" в столбце GridViewColumn и в шаблоне ячейки.Теперь он должен выбирать только TextBox внутри шаблона данных на вкладке Change.

Попробуйте это:

<ListView DataContext="List" IsTabStop="False" >
        <ListView.View>
            <GridView>
                <GridViewColumn  Header="Name" />
                <GridViewColumn Header="Selector">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate  >
                            <TextBox Text="{Binding Name}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
...