2015-03-25 3 views
2

У меня есть listbox, который имеет свою itemSource привязывается к collectionViewSource что группируется и имеют 2 уровня группировок более фактические элементы:CollectionViewSource отмените SelectedItem при нажатии на имя группы

 <ListBox ItemsSource="{Binding Source={StaticResource myCVS}}" ItemTemplate="{StaticResource myItemsTemplate}" ItemContainerStyle="{StaticResource myItemsStyle}" SelectedItem="{Binding SelectedListItem}" > 
      <ListBox.GroupStyle> 
       <GroupStyle ContainerStyle="{StaticResource HeaderStyle}" /> 
       <GroupStyle ContainerStyle="{StaticResource SubHeaderStyle}" /> 
      </ListBox.GroupStyle> 
     </ListBox> 

С CollectionViewSource, связанными с ObservabeleCollection:

 <CollectionViewSource x:Key="myCVS" Source="{Binding Path=myItemsToGroup}"> 
      <CollectionViewSource.GroupDescriptions> 
       <PropertyGroupDescription PropertyName="HeaderName" /> 
       <PropertyGroupDescription PropertyName="SubHeaderName" /> 
      </CollectionViewSource.GroupDescriptions> 
     </CollectionViewSource> 

элементы в ObservalbleCollection выглядят как:

public class Items 
{ 
    public string GroupName; 
    public string SubGroupName; 
    public string ItemName; 
} 

Это все прекрасно работает я в конечном итоге с:

Header1 
|_SubHeader1 
    |_item1 
    |_item2 
Header2 
|_SubHeader2 
    |_item1 
    |_item2 

Проблема заключается в том, если я нажимаю элемент он будет выделен, и остается выбрать, если я нажимаю на заголовок или подзаголовок. Если щелкнуть заголовок, я хотел бы установить SelectedItem в значение null. Я использую команду для удаления SelectedItem из пользовательского интерфейса, но я не хочу, чтобы команда выполнялась, если щелкнуть заголовок или подзаголовок только при нажатии элемента.

ответ

2

GroupStyle s не могут быть выбраны, поэтому, конечно, ваша модель обзора не увидит изменения в выборе.

Чтобы обойти это, вы можете использовать какой-то код позади. Вы заметите, что если вы нажмете на элементы в ListBox, то ListBoxItem присвоит true значение свойства Handled события MouseUp. Если вы щелкните в другом месте на ListBox, ничего не обрабатывает событие. С учетом сказанного вы можете установить свой выбранный элемент на основе состояния Handled.

XAML:

<ListBox ItemsSource="{Binding Source={StaticResource myCVS}}" 
     ItemTemplate="{StaticResource myItemsTemplate}" 
     ItemContainerStyle="{StaticResource myItemsStyle}" 
     SelectedItem="{Binding SelectedListItem}" 
     MouseLeftButtonUp="ListBox_MouseLeftButtonUp"> 

Code-за:

private void ListBox_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    if(!e.Handled) 
    { 
     var lb = sender as ListBox; 
     lb.SelectedItem = null; 
    } 
} 

Добавление:

Нажатие на уже выбранного пункта будет установить SelectedItem к нулю. Чтобы не допустить этого, сделайте следующее: вместо того, чтобы использовать MouseLeftButtonUp использовать MouseDown:

<ListBox ItemsSource="{Binding Source={StaticResource myCVS}}" 
     SelectedItem="{Binding SelectedListItem}" 
     MouseDown="ListBox_MouseLeftButtonUp"> 

Here это состояние моего текущего приложения (GroupStyle iS) не втянуться должным образом, но реализация, что здесь важно. Если это не сделает это для вас, я бы использовал чистый подход MVVM.

+0

Спасибо, это работает, мне просто нужно немного подкорректировать его. Он делает именно то, что я хочу, спасибо! – user1336827

+0

@ пользователь1336827 хорошо. не забывайте присуждать награду, если она подходит;) – Kcvin

+0

Возможно, вы могли бы помочь с другим битком. Элемент становится выбранным по нажатию мыши (выделено в списке) при наведении курсора вверх (на выбранном элементе) уходит. Я могу обойти это, установив прозрачный цвет фона выбранного элемента и выбралItemInactive цвет фона. И весь мой другой код все еще работает (команды), но я хотел бы визуально сохранить выделенный элемент выделенным. и только установите его равным null при щелчке по групповому типу. Есть предположения? – user1336827

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