2011-05-13 2 views
1

Когда вы нажимаете на элемент управления внутри ListBox (его DataTemplate), я хочу знать, какой элемент это так, чтобы я мог выбрать этот элемент.Нажмите на ListBox с помощью DataTemplate, выберите ListBox. Item

У меня есть приложение WPF с ListBox. Используя DataTemplate, у меня есть TextBlock и Textbox внутри него.

<ListBox PreviewMouseLeftButtonDown="myHandler"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel> 
     <TextBlock /> 
     <TextBox /> 
     </StackPanel> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Прямо сейчас, если вы нажмете на TextBlock, он выбирает общий элемент. Но если вы нажмете внутри TextBox (чтобы повторить: Box, а не Block), он не выбирает элемент.

Есть ли код, который я могу вставить в PreviewMouseLeftButtonDown ListBox, который может указать мне индекс ListBoxItem, чей TextBox я нажал? Или каким-то другим способом выбрать ListBoxItem?

ответ

2

сначала я хотел бы, чтобы вы, чтобы взглянуть еще раз на композиции UI ... Textboxes, как предметы в ListBox редко. Список - это, как правило, селекторы (не редакторы) элементов.

С этим с дороги .. и если вы действительно должны это иметь. Используйте подход на основе ViewModel (найдите статью MVVM Джоша Смита, если вы новичок в этом). Идея создания этой работы была бы ответом VM/ItemVM listen на уведомление об изменении TextProperty. Как только он получает один, он находит соответствующий элемент и переключает свойство IsSelected объекта. Вам необходимо привязать свойство IsSelected ListItem к свойству IsSelected виртуальной машины, чтобы это работало.

0

Если вы используете mvvm, используйте подход, предложенный Гишу.

Если вы не можете использовать событие TextBox GetFocus, чтобы подойти к визуальному дереву до списка и выбрать его.