我有一个DataGridTextViewColumn,我想限制输入。我已经为PreviewTextInput和PreviewKeyDown事件附加了处理程序,但我还需要通过Paste命令限制输入。如何处理此文本列的“粘贴”命令?我的尝试如下:
<DataGridTextColumn Binding="{Binding MyProperty, UpdateSourceTrigger=PropertyChanged}"
Width="Auto">
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<EventSetter Event="PreviewTextInput"
Handler="MyProperty_PreviewTextInput"/>
<!-- Space, backspace, and delete are not available in PreviewTextInput,
so we have to capture them in the PreviewKeyDown event -->
<EventSetter Event="PreviewKeyDown"
Handler="MyProperty_PreviewKeyDown"/>
<!-- I get a compiler error that "The Property Setter 'CommandBindings'
cannot be set because it does not have an accessible set accessor" -->
<Setter Property="CommandBindings">
<Setter.Value>
<CommandBinding Command="Paste"
Executed="MyProperty_PasteExecuted"/>
</Setter.Value>
</Setter>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
我明白为什么我的尝试不起作用,我只是找不到一个我很满意的解决方案。到目前为止,我发现的唯一解决方案是2010年的这篇SO帖子(DataGridTextColumn event binding)。我希望现在有一个更好的解决方案。
答案 0 :(得分:2)
从错误CommandBindings
属性doesn't have setter
可以看出,因此您无法从Style设置它,但如果将CommandBindings声明为inline element in TextBox
,则可以执行此操作。
在内部,如果在textBox中将其声明为内联,则xaml会在属性上调用CommandBindings.Add()
。因此,作为一种变通方法,您可以使用DataGridTemplateColumn
并提供CellTemplate
和CellEditingTemplate
来查看DataGridTextColumn
。小样本 -
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding MyProperty}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding MyProperty}"
PreviewTextInput="MyProperty_PreviewTextInput"
PreviewKeyDown="MyProperty_PreviewKeyDown">
<TextBox.CommandBindings>
<CommandBinding Command="Paste"
Executed="CommandBinding_Executed"/>
</TextBox.CommandBindings>
</TextBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>