Обработка выбранного элемента списка - PullRequest
0 голосов
/ 21 марта 2012

Похоже, это будет распространенной проблемой ...

Я использую MVVM Light

У меня есть список, определенный в моем xaml

<ListBox ItemsSource="{Binding Events}" SelectedItem="{Binding SelectedEvent, Mode=TwoWay}">

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Tap">
            <cmd:EventToCommand Command="{Binding EventPageCommand, Mode=OneWay}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border Padding="0,0,0,22">
                <StackPanel>
                    <TextBlock Text="{Binding Name}" />
                    <TextBlock Text="{Binding Preview}" TextWrapping="Wrap"/>
                </StackPanel>
            </Border>
        </DataTemplate>

     </ListBox.ItemTemplate>
 </ListBox>

Это работает отлично и прекрасно, за исключением того, что пользователь может щелкнуть ниже этого списка, и событие все еще вызывается.

Я могу изменить его для использования SelectionChanged, например:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <cmd:EventToCommand Command="{Binding EventPageCommand, Mode=OneWay}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

Но тогда, если я использую кнопку «Назад», я не могу выбрать один и тот же элемент дважды, поскольку выбор фактически не изменился.Я мог бы, вероятно, зайти в свой код и установить выбранный индекс = -1 при загрузке страницы, но это выглядит как взлом, и я использую списки в довольно многих местах, и мне не хотелось бы помнить, чтобы делать этот взлом везде.

Есть идеи?

edit
Я добавил цвет фона для своего списка и своих элементов списка, и пока мои элементы списка занимают только то место, которое занимает текстокно списка занимает весь экран, расширяясь ниже последнего элемента списка.Возможно, одним из способов было бы зарезервировать это дополнительное пространство.

update
, что до сих пор кажется наилучшим, - это установить VerticalAlignmnet="Top" в списке (это увеличиваетдополнительное место внизу, не знаю почему, но тогда прокрутка заканчивается внизу списка, а не внизу экрана).Затем я отключил прокрутку на самом списке ScrollViewer.VerticalScrollBarVisibility="Disabled" и обернул все это в <ScrollViewer>

Ответы [ 2 ]

1 голос
/ 24 марта 2012

В настоящее время вы ищете событие Tap для всего списка, а не для отдельного элемента.

Обычно я использую триггеры взаимодействия:

<DataTemplate DataType="{x:Type ViewModel:DataItem}" x:Key="ItemTemplate">
    <ContentControl>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Tap">
                <i:InvokeCommandAction Command="{Binding Tap}"/>
            </i:EventTrigger>
            <i:EventTrigger EventName="KeyUp">
                <i:InvokeCommandAction 
                   Command="{Binding RelativeSource={RelativeSource 
                             Mode=FindAncestor, 
                             AncestorType={x:Type ListBox}}, 
                             Path=DataContext.KeyUpCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <TextBox Text="{Binding Name}"/>
    </ContentControl>
</DataTemplate>

Inв этом примере событие Tap привязывается к команде в DataContext (элемент данных) ItemsControl, тогда как событие KeyUp привязывается к команде в родительском DataContext объекта ListBox.

0 голосов
/ 22 марта 2012

Если все, что вам нужно, это получить событие, когда пользователь нажимает на элемент, почему бы вам не использовать код триггера, который есть в элементе Border шаблона?

Возможно, вам придется использоватьсвойство Source для привязки команды к ViewModel, но это также может быть легко достигнуто (будет зависеть от того, как вы сейчас устанавливаете Page DataContext)

...