2011-08-11 56 views
6

所以我基本上有這樣的ListView,我想按Tab鍵,通過我的TreeViewItems迭代(最好是隻有我的文本框)如何使用TextBoxes作爲TreeViewItems通過ListView進行製表符?

<ListView> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="number" /> 
      <GridViewColumn Header="Selector"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding SelectorName}"/> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

是我看到是按選項卡首次全後的情景第一個TreeViewItem被選中,並再次按下Tab選擇第一個TextBox。最後,第三個TAB從TreeView中移出到下一個控件,儘管在「tabing」到下一個控件之前還有更多的TextBox。 Thankx

編輯: 問題是在這裏找到答案: How to TAB through TextBoxes in a ListView

回答

2

也許我失去了一些東西,但我無法找到任何簡單的方法來做到這一點,這裏將是你可以做一個概要:

<ListView.InputBindings> 
    <KeyBinding Key="Tab" Command="{Binding GoToNextItem}" 
      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}}" /> 
    <KeyBinding Modifiers="Shift" Key="Tab" Command="{Binding GoToPreviousItem}" 
      CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}}" /> 
</ListView.InputBindings> 
<ListView.ItemContainerStyle> 
    <Style TargetType="{x:Type ListViewItem}"> 
     <EventSetter Event="Selected" Handler="ItemSelected" /> 
    </Style> 
</ListView.ItemContainerStyle> 
<ListView.View> 
    <GridView> 
     <GridViewColumn Header="number" /> 
     <GridViewColumn Header="Selector"> 
      <GridViewColumn.CellTemplate> 
       <DataTemplate> 
        <TextBox Name="_tb" Text="{Binding SelectorName}"/> 
       </DataTemplate> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
    </GridView> 
</ListView.View> 

事情我在這裏做的:

  • 替代選項卡行爲火命令來選擇另一項目
  • 事件處理程序添加到選定的事件集中在TextBox
  • 名稱文本框,因此它可以被發現和集中

代碼:

private readonly ICommand _GoToNextItem = new Command((p) => 
    { 
     var lv = p as ListView; 
     if (lv.SelectedIndex == -1 || lv.SelectedIndex == lv.Items.Count - 1) 
     { 
      lv.SelectedIndex = 0; 
     } 
     else 
     { 
      lv.SelectedIndex++; 
     } 
    }); 
public ICommand GoToNextItem { get { return _GoToNextItem; } } 

private readonly ICommand _GoToPreviousItem = new Command((p) => 
{ 
    var lv = p as ListView; 
    if (lv.SelectedIndex <= 0) 
    { 
     lv.SelectedIndex = lv.Items.Count - 1; 
    } 
    else 
    { 
     lv.SelectedIndex--; 
    } 
}); 
public ICommand GoToPreviousItem { get { return _GoToPreviousItem; } } 
private void ItemSelected(object sender, RoutedEventArgs e) 
{ 
    var item = sender as ListBoxItem; 
    (FindNamedChild(item, "_tb") as TextBox).Focus(); 
} 

public static object FindNamedChild(DependencyObject container, string name) 
{ 
    if (container is FrameworkElement) 
    { 
     if ((container as FrameworkElement).Name == name) return container; 
    } 
    var ccount = VisualTreeHelper.GetChildrenCount(container); 
    for (int i = 0; i < ccount; i++) 
    { 
     var child = VisualTreeHelper.GetChild(container, i); 
     var target = FindNamedChild(child, name); 
     if (target != null) 
     { 
      return target; 
     } 
    } 
    return null; 
} 

這是非常粗略的,使用任何部分這需要您自擔風險。 (聚焦也可能是不同的做法,而不使選擇到這一點,我覺得

Command類只是一個普通的實施ICommand這需要其在接口的Execute方法執行的拉姆達)

+0

謝謝H.B.我實際上最終沒有使用它,因爲它很煩人,當你有很多文本框你不會離開ListView,雖然你想。我不知道SHIFT + TAB可以再次選擇TreeviewItem,然後你可以迭代上下箭頭,並且仍然有按Tab的選項離開TreeView到下一個控制。 –

+0

@Mohamed Cheri:是的,被卡住不是很方便。我希望這對你仍然有一些。 –

0

設置IsTabStop在GridViewColumn並在Cell模板= 「FALSE」。它現在應該只在選項卡更改的數據模板中選擇 TextBox。

試試這個:

<ListView DataContext="List" IsTabStop="False" > 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Name" /> 
       <GridViewColumn Header="Selector"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate > 
          <TextBox Text="{Binding Name}" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 
+0

是無效的XA​​ML。你的意思是? –

+0

這不行,列不支持這樣的屬性,焦點仍然留下整個控件而不是去下一個項目。 –

相關問題