2010-08-04 66 views
0

此代碼在TextBox控件內部生成帶有網格,多個名稱和電子郵件的Listview。我想知道如何捕獲一行的文本框中的焦點事件以使整個ListView行被選中。如何在ListView網格中捕獲TextBox的焦點

<ListView Name="lstRecipients" ItemsSource="{Binding Path=Recipients}"> 
    <ListView.Resources> 
     <DataTemplate x:Key="tbNameTemplate"> 
      <TextBox Name="tbName" Text="{Binding Path=Username, ValidatesOnDataErrors=True}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="tbEmailTemplate"> 
      <TextBox Name="tbEmail" Text="{Binding Path=Email, ValidatesOnDataErrors=True}"/> 
     </DataTemplate> 
    </ListView.Resources> 
    <ListView.View> 
     <GridView x:Name="gvRecipients"> 
      <GridViewColumn Header="Name" CellTemplate="{StaticResource tbNameTemplate}"/> 
      <GridViewColumn Header="Email" CellTemplate="{StaticResource tbEmailTemplate}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 

回答

1

您可以對設置在ListView中所選項目的文本框的處理程序添加到GotFocus事件。您可以使用ItemsControl.ContainerFromElement來獲取ListViewItem和ItemContainerGenerator.ItemFromContainer以獲取綁定的數據對象。在XAML:

<TextBox GotFocus="tbName_GotFocus" Name="tbName" Text="{Binding Path=Username, ValidatesOnDataErrors=True}"/> 

在後臺代碼:

private void tbName_GotFocus(object sender, RoutedEventArgs e) 
{ 
    var container = lstRecipients.ContainerFromElement((DependencyObject)sender); 
    if (container != null) 
    { 
     lstRecipients.SelectedItem = lstRecipients.ItemContainerGenerator 
      .ItemFromContainer(container); 
    } 
} 

你也可以設置ListView控件的處理程序,因爲的GotFocus是一個路由事件。你可以用它來創建一個可以在ListView之間共享的處理程序。在XAML:

<ListView GotFocus="lstRecipients_GotFocus" Name="lstRecipients" ItemsSource="{Binding Path=Recipients}"> 

在後臺代碼:

private void lstRecipients_GotFocus(object sender, RoutedEventArgs e) 
{ 
    var selector = sender as Selector; 
    if (selector != null) 
    { 
     var container = selector.ContainerFromElement 
      ((DependencyObject)e.OriginalSource); 
     if (container != null) 
     { 
      selector.SelectedItem = selector.ItemContainerGenerator 
       .ItemFromContainer(container); 
     } 
    } 
} 

(如果你不想文本框可編輯的一切,你也可以只設置Focusable="False"或使用一個TextBlock代替文本框和焦點將轉到ListView並選擇單元格單擊時的行。)