2009-06-19 2 views
2

У меня есть AutoCompleteBox внутри CellEditingTemplate для DataGridTemplateColumn, и я пытаюсь автофокусироваться на нем после того, как определенное число символов было введено в предыдущем столбце.Установить фокус на AutoCompleteBox в DataGridTemplateColumn

Мне удалось настроить фокус на сдвиг, а каретку установить соответствующим образом с помощью метода BeginInvoke (описано here), но только если элемент управления является TextBox. при использовании этого метода с AutoCompleteBox каретка не устанавливается, и элемент управления не получает фокуса.

Я попытался настроить фокус на AutoCompleteBox вручную, получив ссылку на него внутри метода setCaretInCurrentCell и вызвав фокус, но это тоже не сработало.

Я действительно хочу использовать функцию AutoCompleteBox в этом столбце, но datagrid должен быть оптимизирован для ввода данных, который мешает, если пользователи не могут вставить или автоматически перейти к следующему полю своей пробной пробкой.

Спасибо.

+0

вам удалось найти решение для этого? Я сталкиваюсь с аналогичной проблемой. Не могли бы вы мне помочь? – Gopinath

ответ

0

Я мог бы пойти с самым странным предложением на этом, но вместо того, чтобы пытаться попасть в дерево сетки/управления и быть явным с вещами, используйте параметр Current Column.

срывая образец шаблона данных в файлы справки в XAML и basiccode следующим образом:

Не совершенное длинный край в том, что:

  • это просто взлом вместе переход от колонки От 0 до 1 на основе нажатия пробела, ваше требование о перемещении фокуса является более сложным.
  • Я не настроил двустороннюю привязку, поэтому редактирование сохраняется и т. Д. Просто посмотрел, как перемещать столбцы.

Но когда он запускается, он реагирует на пробел и перемещает курсор в поле автозаполнения, выделяет текст, и если я начинаю вводить всплывающее окно автозаполнения, активируется. Поэтому в принципе установка текущего столбца, по-видимому, обеспечивает поведение, которое вы выполняете.

А.

Код:

<UserControl x:Class="SilverlightApplication2.MainPage" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
     xmlns:input="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input" 
     xmlns:toolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit" 
     xmlns:system="clr-namespace:System;assembly=mscorlib" 
     Width="400" Height="300"> 
     <ScrollViewer VerticalScrollBarVisibility="Auto" BorderThickness="0"> 
      <StackPanel Margin="10,10,10,10"> 

       <TextBlock Text="DataGrid with template column and custom alternating row backgrounds:"/> 
       <data:DataGrid x:Name="dataGrid5" 
       Height="125" Margin="0,5,0,10" 
       AutoGenerateColumns="False" 
       RowBackground="Azure" 
       AlternatingRowBackground="LightSteelBlue"> 
        <data:DataGrid.Columns> 
         <!-- Address Column --> 
         <data:DataGridTemplateColumn Header="Address" Width="300"> 
          <data:DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <TextBlock Padding="5,0,5,0" Text="{Binding Address}"/> 
           </DataTemplate> 
          </data:DataGridTemplateColumn.CellTemplate> 
          <data:DataGridTemplateColumn.CellEditingTemplate> 
           <DataTemplate> 
            <TextBox Padding="5,0,5,0" Text="{Binding Address}"/> 
           </DataTemplate> 
          </data:DataGridTemplateColumn.CellEditingTemplate> 
         </data:DataGridTemplateColumn> 
         <!-- Name Column --> 
         <data:DataGridTemplateColumn Header="Name"> 
          <data:DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <StackPanel Orientation="Horizontal"> 
             <TextBlock Padding="5,0,5,0" 
             Text="{Binding FirstName}"/> 
            </StackPanel> 
           </DataTemplate> 
          </data:DataGridTemplateColumn.CellTemplate> 
          <data:DataGridTemplateColumn.CellEditingTemplate> 
           <DataTemplate> 
            <StackPanel Orientation="Horizontal"> 
             <input:AutoCompleteBox Padding="5,0,5,0" 
             Text="{Binding FirstName}"> 
              <input:AutoCompleteBox.ItemsSource> 
               <toolkit:ObjectCollection> 
                <system:String>January</system:String> 
                <system:String>February</system:String> 
                <system:String>March</system:String> 
                <system:String>April</system:String> 
                <system:String>May</system:String> 
                <system:String>June</system:String> 
                <system:String>July</system:String> 
                <system:String>August</system:String> 
                <system:String>September</system:String> 
                <system:String>October</system:String> 
                <system:String>November</system:String> 
                <system:String>December</system:String> 
               </toolkit:ObjectCollection> 
              </input:AutoCompleteBox.ItemsSource> 
             </input:AutoCompleteBox> 
            </StackPanel> 
           </DataTemplate> 
          </data:DataGridTemplateColumn.CellEditingTemplate> 
         </data:DataGridTemplateColumn> 

        </data:DataGrid.Columns> 
       </data:DataGrid> 
       <Button Content="test"></Button> 
      </StackPanel> 
     </ScrollViewer> 

    </UserControl> 






using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

namespace SilverlightApplication2 
{ 
    public partial class MainPage : UserControl 
    { 
     public MainPage() 
     { 
      InitializeComponent(); 

      // Set the ItemsSource to autogenerate the columns. 

      dataGrid5.ItemsSource = Customer.GetSampleCustomerList(); 

      dataGrid5.KeyDown += new KeyEventHandler(dataGrid5_KeyDown); 

     } 

     void dataGrid5_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Key == Key.Space) 
      { 
       // move to next cell and start editing 
       DataGrid grd = (DataGrid)sender; 
       if (grd.CurrentColumn.DisplayIndex == 0) 
       { 
        // move to column 1 and start the edit 
        grd.CurrentColumn = grd.Columns[1]; 
       } 
      } 
     } 
    } 

    public class Customer 
    { 
     public String FirstName { get; set; } 
     public String LastName { get; set; } 
     public String Address { get; set; } 
     public Boolean IsNew { get; set; } 

     // A null value for IsSubscribed can indicate 
     // "no preference" or "no response". 
     public Boolean? IsSubscribed { get; set; } 

     public Customer(String firstName, String lastName, 
      String address, Boolean isNew, Boolean? isSubscribed) 
     { 
      this.FirstName = firstName; 
      this.LastName = lastName; 
      this.Address = address; 
      this.IsNew = isNew; 
      this.IsSubscribed = isSubscribed; 
     } 

     public static List<Customer> GetSampleCustomerList() 
     { 
      return new List<Customer>(new Customer[4] { 
       new Customer("A.", "Zero", 
        "12 North", 
        false, true), 
       new Customer("B.", "One", 
        "34 West", 
        false, false), 
       new Customer("C.", "Two", 
        "56 East", 
        true, null), 
       new Customer("D.", "Three", 
        "78 South", 
        true, true) 
      }); 
     } 
    } 

} 
Смежные вопросы