Список Wpf с DataTemplate не выбирает элемент, когда выбран элемент управления шаблона - PullRequest
4 голосов
/ 22 декабря 2010

У меня есть список с шаблоном данных.Шаблон данных очень прост, содержит два текстовых поля.Если я щелкну за пределами текстовых полей в сетке вокруг них, в списке появится строка.Если щелкнуть текстовое поле, текстовое поле получает фокус, но поле списка не выбирает эту строку.Я нарисовал шаблон, используя Expression Blend, если это поможет объяснить некоторые значения, Margin и т. Д.

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Я думал, что добавлю свой собственный ответ, чтобы рассказать о том, что я узнал.Я сделал то, что не было показано в связанном ответе выше.

Итак, у меня есть DataTemplate:

<DataTemplate DataType="{x:Type Scratch:CollectionItem}">
    <Grid Height="20" Width="288">
    <TextBox HorizontalAlignment="Left" Margin="8,0,0,0" TextWrapping="Wrap" Text="{Binding Id}" VerticalAlignment="Top" Width="86" PreviewMouseDown="APreviewMouseDown" GotFocus="AGotFocus" GotKeyboardFocus="AGotKeyboardFocus" PreviewGotKeyboardFocus="AGotKeyboardFocus"/>
    <TextBox Margin="98,0,0,0" TextWrapping="Wrap" Text="{Binding Detail}" VerticalAlignment="Top" PreviewMouseDown="APreviewMouseDown" GotFocus="AGotFocus" GotKeyboardFocus="AGotKeyboardFocus" PreviewGotKeyboardFocus="AGotKeyboardFocus"/>
</Grid>

Все события происходят, я в итоге остановился на GotFocus.Имена А * были откуда-то, где я пытался переименовать вещи, чтобы понять, почему события не запускались.Выход из Visual Studio и перезапуск, казалось, исправили это.Этот компьютер не очень надежен.

Как видите, DataTemplate предназначен для элементов типа CollectionItem.Я экспериментировал с коллекциями INotifyPropertyChanged и Observable.Детали не важны.

Мой ListBox связан с {Binding Path = Items}, где Items - ObservableCollection

Мое событие фокуса - это вариация решений, найденных в другом потоке.,Поскольку мой ListBox напрямую связан со списком объектов CollectionItem, следующее работает и выглядит чище, чем работа с шаблонным родителем и т. Д.

private void AGotFocus(object sender, RoutedEventArgs e)
{
    try
    {
        FrameworkElement element = sender as FrameworkElement;
        CollectionItem item = element.DataContext as CollectionItem;
        if (item != null)
        {
            listBox2.SelectedValue = item;
        }
    }
    catch { }
}

Так что в приведенном выше случае отправитель является одним из двух TextBoxего DataContext указывает на CollectionItem, и мы можем установить элемент списка, который будет выбран, выбрав этот элемент.

Не знаю, поможет ли это кому-нибудь, но оно есть:)

...