2014-10-22 5 views
0

Мой список привязан к источнику элементов, а свойство selecteditem также привязано. Большая часть моей работы выполняется в свойстве selecteditem. На самом деле у меня есть два списка, для каждого элемента в первом списке есть несколько дочерних элементов в коллекции. В отношении всех элементов, выбранных в первом списке, их дочерние элементы должны быть добавлены во второй список.WPF ListBox выбранный элемент не изменен при использовании DataTemplate

Проблема заключается в выборе пункта (проверяя флажок) не вызывает свойство SelectedItem изменилось

XAML для моего управления ListBox являются

<ListBox SelectionMode="Multiple" ItemsSource="{Binding Charts,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedChart, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <CheckBox Content="{Binding ChartName}" VerticalAlignment="Center" IsChecked="{Binding IsChartSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
</ListBox> 

<ListBox ItemsSource="{Binding Tracks, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate > 
        <StackPanel Orientation="Horizontal"> 
         <CheckBox VerticalAlignment="Center" IsChecked="{Binding IsTrackSelected}"/> 
         <TextBlock Margin="5 0 0 0" VerticalAlignment="Center" Text="{Binding TrackName}"/> 
        </StackPanel> 
       </DataTemplate> 
    </ListBox.ItemTemplate> 

Мой выбор Диаграмма Изменены свойства в силу модель:

public ChartSourceForMultipleSelection SelectedChart 
    { 
     get { return _selectedChart; } 
     set 
     { 
      _selectedChart = value; 
      ChartSelectionChanged(); 
      NotifyPropertyChanged("SelectedChart"); 
     } 
    } 

ответ

1

Это связывание не имеет никакого смысла:

<CheckBox IsChecked="{Binding IsTrackSelected, 
    RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" /> 

Это пытается привязать к свойству IsTrackSelected на внешней ListBoxItem, но такое свойство не существует. Это не похоже на то, что вам нужен RelativeSource, если IsTrackSelected является свойством базового элемента данных.

Кроме того, я не уверен, почему вы являетесь ListBox для коллекции треков; это похоже на то, что ваши концепции выбора дорожки отделены от концепции выделенного элемента ListBox. Почему бы не использовать простой ItemsControl вместо этого?

Как вашей основной проблемы, CheckBox в шаблоне элемента ест мышь/фокус события, которые, как правило, сообщающие ListBox, чтобы выбрать родительский ListBoxItem при нажатии. Вы можете вручную обновить состояние выбора ListBoxItem, когда его внутренний CheckBox получает фокус клавиатуры.

Добавить GotKeyboardFocus="OnChartCheckBoxGotKeyboardFocus" в список диаграмма шаблона элемента в CheckBox, дают поле списка диаграммы имя, например, x:Name="ChartsList", и написать обработчик в коде позади:

private void OnChartCheckBoxGotKeyboardFocus(
    object sender, 
    KeyboardFocusChangedEventArgs e) 
{ 
    var checkBox = sender as CheckBox; 
    if (checkBox == null) 
     return; 

    var listBoxItem = ItemsControl.ContainerFromElement(ChartsList, checkBox) 
         as ListBoxItem; 
    if (listBoxItem != null) 
     listBoxItem.IsSelected = true; 
} 
+0

Как вы планируете получить уведомление просмотреть флажок checkbox/unchecked. Поскольку связанное свойство является частью сущности и не вызывает какого-либо события в виртуальной машине. – MegaMind

+0

Ах, я не видел привязку 'SelectedItem', потому что она была вне экрана. В этом случае мои предыдущие комментарии об использовании 'ItemsControl' относятся только ко второму списку треков. Когда вы переключаете флажок в первом списке, выбирается ли родительский элемент «ListBoxItem»? –

+0

Нет родительского элемента, который не выбирается, и это реальная проблема. – MegaMind

Смежные вопросы