DataGridTextColumn CharacterCasing в DataGrid - PullRequest
1 голос
/ 25 октября 2011

Я пытаюсь получить DataGridTextColumn, чтобы разрешить только верхний корпус.

Очевидным подходом было бы установить CharacterCasing в Upper для EditingElementStyle TextBox. Это прекрасно работает до тех пор, пока вы входите в режим редактирования до начала ввода, но если вы начнете печатать, когда ячейка не находится в режиме редактирования, тогда первый символ, введенный в TextBox, будет строчным (после этого, когда ячейка перешла в режим редактирования, все работает как положено).

У меня такое ощущение, что это ошибка, или я что-то упустил, предполагая, что установка CharacterCasing на Upper должна помочь? У кого-нибудь есть решение или обходной путь для этого?

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

enter image description here

MainWindow.xaml

<DataGrid ItemsSource="{Binding MyList}"
          AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Test Character Casing"
                            Binding="{Binding Name}">
            <DataGridTextColumn.EditingElementStyle>
                <Style TargetType="TextBox">
                    <Setter Property="CharacterCasing" Value="Upper"/>
                </Style>
            </DataGridTextColumn.EditingElementStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        MyList = new List<MyItem>();
        MyList.Add(new MyItem { Name = "" });
        MyList.Add(new MyItem { Name = "" });
        this.DataContext = this;
    }
    public List<MyItem> MyList { get; set; }
}

public class MyItem
{
    public string Name { get; set; }
}

1 Ответ

3 голосов
/ 09 ноября 2011

Я почти уверен, что это ошибка, и я создал обходной путь, используя Attached Behavior.Вместо установки CharacterCasing="Upper" я использую behaviors:TextBoxUpperCaseBehavior.IsEnabled="True".

<Style TargetType="TextBox" x:Key="dataGridUpperCaseTextBoxStyle">
    <Setter Property="behaviors:TextBoxUpperCaseBehavior.IsEnabled" Value="True"/>
</Style>

TextBoxUpperCaseBehavior

public static class TextBoxUpperCaseBehavior
{
    public static readonly DependencyProperty IsEnabledProperty =
        DependencyProperty.RegisterAttached("IsEnabled",
                                            typeof(bool),
                                            typeof(TextBoxUpperCaseBehavior),
                                            new UIPropertyMetadata(false, OnIsEnabledChanged));
    [AttachedPropertyBrowsableForType(typeof(TextBox))]
    public static bool GetIsEnabled(TextBox comboBox)
    {
        return (bool)comboBox.GetValue(IsEnabledProperty);
    }
    public static void SetIsEnabled(TextBox comboBox, bool value)
    {
        comboBox.SetValue(IsEnabledProperty, value);
    }

    private static void OnIsEnabledChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        TextBox textBox = target as TextBox;
        if ((bool)e.NewValue == true)
        {
            textBox.CharacterCasing = CharacterCasing.Upper;
            textBox.TextChanged += textBox_TextChanged;
        }
        else
        {
            textBox.CharacterCasing = CharacterCasing.Normal;
            textBox.TextChanged -= textBox_TextChanged;
        }
    }

    private static void textBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        if (textBox.Text.ToUpper() != textBox.Text)
        {
            textBox.Text = textBox.Text.ToUpper();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...