2015-03-24 5 views
2

Я чувствую, что это должна быть простая функция, но я не знаю, как привязываться к выбранным элементам в Listbox без использования кода позади.Получить ListBox SelectedItems

У меня есть список с Datatemplate, содержащий флажок. Я хочу получить список проверенных/выбранных элементов. Как мне это сделать?

Если я не могу получить SelectedItems, я хочу привязать к чему-то, что запускает «SelectedProduct» каждый раз, когда что-то выбирается, поэтому я могу перебирать «ProductList» и находить отмеченные элементы. Однако SelectedItem не запускается каждый раз, когда я нажимаю на элемент.

Вот мой код:

<ListBox ItemsSource="{Binding ProductList}" SelectedItem="{Binding SelectedProduct}" SelectionMode="Multiple"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay}" Content="{Binding ID}" Margin="2"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

<ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsChecked}"/> 
    </Style> 
</ListBox.ItemContainerStyle> 

ответ

2

Нормальный здравомыслящий человек будет думать SelectedItems должен быть Привязываемыми. Кроме ... это не так. И что сосет.

Вы уже попали на обычный подход, связывают IsSelected к свойству в вашем объекте данных, а затем сделать нечто подобное:

myCollection.Where(i => i.Selected); 

По MSDNSelectedItem может вернуть любой выбранный элемент, если выбран режим установлен на «Multiple», поэтому семантика семантики триггера будет в лучшем случае неопределенной. Получение уведомлений, когда любой из будет изменяться, будет сложно, но вы всегда можете запустить логику, когда изменяется свойство Selected (например, поднять событие, которое ожидает VM).

1

Вы можете использовать расширение Интерактивности:

Добавить ссылку на System.Windows.Interactivity.dll используя эталонные мастер, поиск в разделе Extensions.

Затем включают следующее пространство имен в вашем XAML:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

И вы можете сделать это:

<ListBox x:Name="FooList"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged" > 
      <i:InvokeCommandAction Command="{Binding FooCommand}" CommandParameter="{Binding SelectedItems, ElementName=FooList}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ListBox> 

В вашей ViewModel создать ICommand, которые получают текущие выбранные элементы.

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