Отмените выбор элемента из ListBox, чтобы при нажатии вызывать NotifyPropertyChanged - PullRequest
0 голосов
/ 11 сентября 2010

У меня есть ItemsControl с DataTemplates, которые содержат ListBoxes с ItemsSource, все связаны с различными ObservableCollections одного и того же типа, каждый ListBox's SelectedItem связан с тем же свойством, которое вызывает PropertyChanged, так что другие визуальные элементы моего UserControl будут обновляться с деталями SelectedItem.

Все отлично работает, за исключением случая, когда ListBox имеет только один элемент.Когда я щелкаю этот элемент в первый раз, PropertyChanged вызывается так, как вы и ожидаете.Если я нажимаю на элемент в другом ListBox, все по-прежнему работает отлично.Однако при щелчке по одиночному элементу в ListBox, который уже был выбран один раз - он не сообщает SelectedItem о том, что мы фактически выбрали новый элемент, поскольку для ListBox это тот же элемент.

Я ищу чистый способ справиться с этой ситуацией.Есть идеи?

Ответы [ 2 ]

1 голос
/ 11 сентября 2010

Для более сложных сценариев, подобных этому, я лично не буду использовать ListBox.Я просто реализую интерфейс IsSelectable (только со свойством IsSelected) на объектах.Затем я использую своего рода SelectionContextService для регистрации этих моделей / объектов представления, чтобы разрешить несколько независимых выборок в представлении, и обрабатывать множественный выбор / отмену выбора для новых выборок и тому подобного.В шаблонах данных (в основном представлениях) для моделей представления я использую некоторое прикрепленное свойство, чтобы определить поведение выбора (в основном, просто связывая события MouseDown для определения изменений, когда DataContext является ISelectable).В основном это все делается вручную, но я нахожу, что очень легко обрабатывать древовидные представления или выбираемые объекты, разбросанные по всему виду таким образом.

0 голосов
/ 11 сентября 2010

Когда по элементу ListBox щелкают, независимо от того, выбран он или нет, ListBox GotFocus генерируется событие до того, как SelectedItem был изменен - ​​предполагая, что ListBox не в фокусе. Таким образом, установка для SelectedItem значения null в событии GotFocus обновляет SelectedItem.

XAML:

<ItemsControl  ItemsSource="{Binding Path=ParentCollection}">
   <ItemsControl.ItemTemplate>
      <DataTemplate>                                        
           <ListBox GotFocus="ListBox_GotFocus"
                    ItemsSource="{Binding ChildCollection}"
                    SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyView} }, Path=DataContext.SelectedChild}"/>
      </DataTemplate>   
    </ItemsControl.ItemTemplate>
</ItemsControl>

Код сзади:

private void ListBox_GotFocus(object sender, RoutedEventArgs e)
{
   ((ListBox)sender).SelectedItem = null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...