2015-11-24 45 views
0

我有一個帶有網格的ListView ItemTemplate的ListView。 我需要單擊的行的信息,並在ListView上具有IsItemClickEnabled=True,並且需要具有顯示行ID的調試的ItemClick事件處理程序。爲什麼ItemClick事件處理程序返回先前點擊的項目?

我不能弄清楚爲什麼返回的項目總是我之前點擊的項目,而第一次點擊什麼都不產生。

這裏是爲ListView

<ListView x:Name="ListCustomerView" ItemsSource="{x:Bind CustomersFromDB}" Grid.Row="1" HorizontalAlignment="Center" IsItemClickEnabled="True" ItemClick="ListCustomerView_ItemClick"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Grid IsTapEnabled="False"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition> 
        <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition> 
        <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition> 
        <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition> 
        <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition> 
        <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition> 
        <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition> 
        <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition> 
        <ColumnDefinition MinWidth="{StaticResource minColumnWidth}" MaxWidth="{StaticResource maxColumnWidth}"></ColumnDefinition> 

       </Grid.ColumnDefinitions> 
       <TextBlock Grid.Column="0" Text="{Binding CompanyName}"></TextBlock> 
       <TextBlock Grid.Column="1" Text="{Binding FirstName}"></TextBlock> 
       <TextBlock Grid.Column="2" Text="{Binding LastName}"></TextBlock> 
       <TextBlock Grid.Column="3" Text="{Binding Phone}"></TextBlock> 
       <TextBlock Grid.Column="4" Text="{Binding Email}"></TextBlock> 
       <TextBlock Grid.Column="5" Text="{Binding Adress}"></TextBlock> 
       <TextBlock Grid.Column="6" Text="{Binding PostCode}"></TextBlock> 
       <TextBlock Grid.Column="7" Text="{Binding PostArea}"></TextBlock> 
       <TextBlock Grid.Column="8" Text="{Binding Comment}"></TextBlock> 
      </Grid> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

這裏的標記是用於CustomersFromDB的ItemsSource

public List<Customer> CustomersFromDB { get; set; } 
var db = new Database(); 
CustomersFromDB = db.FetchCustomer(); 

public List<Customer> FetchCustomer() 
{ 
    using (SQLiteConnection _connection = new SQLiteConnection(sqlitePlatform, dbFilePath)) 
    { 
     List<Customer> customers = new List<Customer>(); 
     var _customers = _connection.Table<Customer>(); 
     if (_customers.Count() > 0) 
     { 
      foreach (Customer customer in _customers) 
      { 
       customers.Add(customer); 
      } 
     } 
     return customers; 
    } 
} 

和說明 Illustration of list of customers from sqlite database displayed in the ListView using a DataTemplate with a Grid with textblocks.

代碼和事件處理程序

private void ListCustomerView_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    // BUG! the selected item is not firing correctly ending up outputting the previous clicked item 
    Debug.WriteLine((sender as ListView).SelectedItem); 
} 

如上圖所示檢索到客戶,但是當我點擊一行時,id是之前被點擊的,如果是第一次點擊,則爲null。

爲什麼這種奇怪的行爲發生?

+0

你確定事件的順序沒有在ItemClick之後設置SelectedItem嗎?如果您想在SelectedItem更改時發生事件,則會出現['SelectionChanged']事件(https://msdn.microsoft.com/zh-cn/library/system.windows.controls.primitives.selector.selectionchanged( v = vs.110).aspx)。 –

回答

1

這是因爲您使用的是sender.SelectedItem,它可以爲您提供當前選擇。新的選擇,這是你想要的,只是在click事件之後。爲了讓您剛纔點擊的項目,使用e參數:

private void ListCustomerView_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    Debug.WriteLine(e.ClickedItem.ToString()); 
} 

或者,你可以用它代替了ItemClick事件SelectionChanged事件。這會給你使用像你一樣的代碼新的選擇:

private void ListCustomerView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    Debug.WriteLine((sender as ListView).SelectedItem.ToString()); 
} 
+0

當然!我多麼愚蠢,我從前就知道這件事,但它已經有一段時間了。感謝您解釋清楚的答案和關於SelectionChanged事件的提示。 –

0

我沒有測試過,但我猜測,點擊事件發生選擇事件發生之前。因此,當您的點擊事件處理程序觸發時,所選項目就是「之前」選擇的項目。我相信你正在尋找ItemClickedEventArgs上的ClickedItem屬性

相關問題