2012-03-21 79 views
0

看起來這將是一個普遍的問題...處理列表框中選擇項

我使用MVVM光

我在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,但這看起來很詭異,而且我在很多地方使用了列表框,並且我不想記住要在任何地方進行這種攻擊。

任何想法?

編輯
我加了背景顏色爲我的列表框和列表框我的項目,而我的列表框項目只佔用文本所佔用的空間是什麼,列表框佔據整個屏幕,最後一個項目列表框下方延伸。也許有一種方法是支撐這個額外的空間。

更新
什麼似乎工作迄今最好的是設置VerticalAlignmnet="Top"在列表框(這岸邊了底部的額外空間,不知道爲什麼,但隨後在列表的底部滾動結束,而不是屏幕的底部)。然後,我禁用滾動列表框本身ScrollViewer.VerticalScrollBarVisibility="Disabled",並將整個東西包裹在<ScrollViewer>

+0

FWIW,我有一個類似的問題,並最終在事件處理程序中將SelectedIndex設置爲-1,然後導航到新頁面。 – Praetorian 2012-03-21 18:52:09

回答

0

如果您只想在用戶點擊某個項目時獲取事件,爲什麼不使用您擁有的觸發器代碼模板的邊框元素?

你可能將不得不使用Source屬性綁定命令視圖模型,但也可以是easely實現(將只取決於你如何設置頁面的DataContext現在)

1

目前你在整個列表框中查找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> 

在該示例的輕敲事件結合於一個ItemsControl的DataContext的(數據項)的命令,而KeyUp事件結合到ListBox的父DataContext上的命令。

+0

'MouseDoubleClick'不是WP列表框上的事件。 'DoubleTap'是,但雙擊並不是預期的用戶體驗。 – earthling 2012-03-26 23:58:00

+0

這只是一個例子。將其更改爲「點按」。 – Phil 2012-03-27 06:07:40

+0

將示例更改爲使用「tap」。我在ListBoxItem而不是ListBox上使用交互觸發器,這是主要觀點。 – Phil 2012-03-27 06:22:15