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/