Как захватить фокус TextBox внутри сетки ListView - PullRequest
0 голосов
/ 04 августа 2010

Этот код генерирует Listview с сеткой из нескольких имен и электронных писем внутри элемента управления TextBox. Я хотел бы знать, как я могу захватить событие фокуса на одном из TextBox строки, чтобы выбрать всю строку ListView.

<ListView Name="lstRecipients" ItemsSource="{Binding Path=Recipients}">
    <ListView.Resources>
        <DataTemplate x:Key="tbNameTemplate">
            <TextBox Name="tbName" Text="{Binding Path=Username, ValidatesOnDataErrors=True}"/>
        </DataTemplate>
        <DataTemplate x:Key="tbEmailTemplate">
            <TextBox Name="tbEmail" Text="{Binding Path=Email, ValidatesOnDataErrors=True}"/>
        </DataTemplate>
    </ListView.Resources>
    <ListView.View>
        <GridView x:Name="gvRecipients">
            <GridViewColumn Header="Name" CellTemplate="{StaticResource tbNameTemplate}"/>
            <GridViewColumn Header="Email" CellTemplate="{StaticResource tbEmailTemplate}"/>
        </GridView>
    </ListView.View>
</ListView>

1 Ответ

1 голос
/ 05 августа 2010

Вы можете добавить обработчик к событию GotFocus в TextBox, который устанавливает выбранный элемент в ListView. Вы можете использовать ItemsControl.ContainerFromElement , чтобы получить ListViewItem, и ItemContainerGenerator.ItemFromContainer , чтобы получить связанный объект данных. В XAML:

<TextBox GotFocus="tbName_GotFocus" Name="tbName" Text="{Binding Path=Username, ValidatesOnDataErrors=True}"/>

В коде позади:

private void tbName_GotFocus(object sender, RoutedEventArgs e)
{
    var container = lstRecipients.ContainerFromElement((DependencyObject)sender);
    if (container != null)
    {
        lstRecipients.SelectedItem = lstRecipients.ItemContainerGenerator
            .ItemFromContainer(container);
    }
}

Вы также можете установить обработчик в ListView, поскольку GotFocus является перенаправленным событием. Вы можете использовать это для создания обработчика, который может быть разделен между ListViews. В XAML:

<ListView GotFocus="lstRecipients_GotFocus" Name="lstRecipients" ItemsSource="{Binding Path=Recipients}">

В коде позади:

private void lstRecipients_GotFocus(object sender, RoutedEventArgs e)
{
    var selector = sender as Selector;
    if (selector != null)
    {
        var container = selector.ContainerFromElement
            ((DependencyObject)e.OriginalSource);
        if (container != null)
        {
            selector.SelectedItem = selector.ItemContainerGenerator
                .ItemFromContainer(container);
        }
    }
}

(Если вы не хотите, чтобы TextBox вообще мог редактироваться, вы также можете просто установить Focusable="False" или использовать TextBlock вместо TextBox, и фокус перейдет к ListView и выберет строку при нажатии на ячейку. .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...