2011-08-11 18 views
6

Vì vậy, tôi về cơ bản có ListView này và tôi muốn nhấn Tab và lặp qua TreeViewItems của tôi (tốt nhất chỉ textbox của tôi)Làm thế nào để TAB thông qua một ListView với TextBoxes như TreeViewItems?

<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> 

Kịch bản mà tôi đang nhìn thấy là sau khi nhấn tab cho lần đầu tiên toàn bộ đầu tiên TreeViewItem được chọn và nhấn Tab một lần nữa TextBox đầu tiên được chọn. Cuối cùng TAB thứ ba được ra khỏi TreeView để kiểm soát tiếp theo mặc dù có nhiều TextBoxes mà tôi muốn bắt trước khi "tabing" để kiểm soát tiếp theo. Thankx

Edit: Các Câu hỏi đã được trả lời ở đây: How to TAB through TextBoxes in a ListView

Trả lời

2

Có lẽ tôi đang thiếu một cái gì đó nhưng tôi không thể tìm thấy bất kỳ phương pháp đơn giản để làm điều này, đây sẽ là một phác thảo về những gì bạn có thể làm:

<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> 

Mọi thứ i đã làm ở đây:

  • Hành vi tab ghi đè để kích hoạt lệnh để chọn một mục khác
  • Thêm xử lý sự kiện cho sự kiện được lựa chọn để tập trung TextBox
  • Tên TextBox để nó có thể được tìm thấy và tập trung

Code:

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; 
} 

này rất sơ sài, sử dụng bất kỳ phần điều này có nguy cơ của riêng bạn. (Các hội tụ toàn cũng có thể đã được thực hiện cách khác nhau mà không mang lại sự lựa chọn thành này tôi nghĩ rằng)

(Lớp Command chỉ là một việc thực hiện chung của ICommand mà phải mất một lambda được thực hiện trong phương pháp của giao diện Execute)

+0

Cảm ơn bạn H.B. tôi thực sự đã kết thúc không sử dụng nó vì nó đã gây phiền nhiễu khi u đã có rất nhiều hộp văn bản u sẽ không nhận được ra khỏi ListView mặc dù u muốn. Và tôi không có ý tưởng rằng SHIFT + TAB có thể chọn TreeviewItem một lần nữa và sau đó u có thể lặp với Mũi tên Lên và Xuống Và vẫn có Tùy chọn nhấn Tab để thoát khỏi TreeView sang Điều khiển tiếp theo. –

+0

@Mohamed Cheri: Có, bị chặn thẻ không phải là rất thuận tiện. Tôi hy vọng điều này vẫn là của một số bạn. –

0

Set IsTabStop = "False" trên GridViewColumn và trên mẫu di động. Hiện tại, bạn chỉ nên chọn Hộp văn bản bên trong Thay đổi tab mẫu dữ liệu.

Hãy thử điều này:

<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

không phải là XAML hợp lệ. bạn có ý đó không? –

+0

Điều này sẽ không làm, các cột không hỗ trợ một thuộc tính như vậy và tiêu điểm vẫn rời khỏi toàn bộ điều khiển thay vì chuyển sang mục tiếp theo. –

Các vấn đề liên quan