c# - 如何更改 TextCompositionEventArgs 中的文本

标签 c# wpf datagrid textbox textinput

C# WPF - 我有一个自定义的可编辑数据网格,它使用我自己的从 DataGridTextColumn 继承的自定义列。在我的列类中,我覆盖了 GenerateEditingElement,以便我可以自动设置诸如 MaxLength、CharacterCasing 等内容。

问题是,当用户突出显示一个单元格,然后键入他们的第一个字符时,数据网格会自动进入编辑模式。所以我的 GenerateEditingElement 触发了,我可以设置文本框。不幸的是,这对于字符大小写来说为时已晚,并且 TextCompositionEventArgs 中已经有一个小写字符。后续类型字符是正确的大小写。

接下来将触发列类 PrepareCellForEdit,它具有 TextCompositionEventArgs。但是,我似乎无法更改文本。我收到 setter 不可用的编译错误。 (即使该属性的 intellisense 帮助确实说了获取和设置)。

无论如何,我可以通过编程将我的 charactercasing 放入文本框中吗? 或者 如何更改 TextCompositionEventArgs 中的文本?

最佳答案

主要思想是订阅TextBox的TextChanged事件。 但诀窍是您无法直接在此事件处理程序上更新 Text 属性。 您必须使用一些小的延迟来执行此操作。 这是可以正常工作的示例:

    public struct MyData
    {
        public string Name { set; get; }
    }

    public MainWindow()
    {
        InitializeComponent();
        ObservableCollection<MyData> oc = new ObservableCollection<MyData> { new MyData(), new MyData() };
        grid.ItemsSource = oc;
    }

    private void Grid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        var col = new DataGridTextColumn();
        Style myStyle = new Style(typeof(TextBox));
        // subsribe to TextChanged event
        myStyle.Setters.Add(new EventSetter(TextBoxBase.TextChangedEvent, new TextChangedEventHandler(OnTextChanged)));
        col.EditingElementStyle = myStyle;
        var binding = new Binding("Name") {Mode = BindingMode.TwoWay};
        col.Binding = binding;
        e.Column = col;
    }

    private static void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += Worker_DoWork;
        worker.RunWorkerAsync(textBox);
        worker.RunWorkerCompleted += Worker_RunWorkerCompleted;          
    }

    static void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        TextBox textBox = e.Result as TextBox;
        if (textBox != null)
        {
            textBox.Text = textBox.Text.ToUpper();
            textBox.CaretIndex = textBox.Text.Length;
        }
    }

    static void Worker_DoWork(object sender, DoWorkEventArgs e)
    {
        Thread.Sleep(1);// This is the trick :)
        e.Result = e.Argument;
    }

关于c# - 如何更改 TextCompositionEventArgs 中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9475283/

相关文章:

javascript - knockout .js |可观察数组仅在最后一个元素更改时触发

c# - HTML 电子邮件正文未正确呈现

c# - 如何检查 Html 元素是否在 WebBrowser 控件 C# 中具有背景图像 css 属性

wpf - 不能将样式建立在另一种样式的基础上

c# - 是否可以设置 DataGrid (SWF) 以调整到最佳大小?

c# - 有什么方法可以在生成的迭代器 block 中获取对 "this"的引用?

c# - WPF - 如何以编程方式备份​​/恢复 LocalDB - ClickOnce

c# - 有没有办法解决Expression Blend的 "extract"WPF控件?

c# - Datagrid 不刷新更改的数据

wpf - 如何在 WPF 数据网格中选择单个单元格?