Установить фокус на AutoCompleteBox в DataGridTemplateColumn - PullRequest
2 голосов
/ 19 июня 2009

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

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

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

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

Спасибо.

1 Ответ

0 голосов
/ 30 июня 2009

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

Копирование образца шаблона данных в файлах справки XAML и basiccode:

Он не идеален с большим запасом в этом:

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

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

A.

Код:

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

}
...