在DataGridTextColumn上处理粘贴命令

时间:2013-04-13 19:56:24

标签: wpf xaml datagrid commandbinding

我有一个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)。我希望现在有一个更好的解决方案。

1 个答案:

答案 0 :(得分:2)

从错误CommandBindings属性doesn't have setter可以看出,因此您无法从Style设置它,但如果将CommandBindings声明为inline element in TextBox,则可以执行此操作。

在内部,如果在textBox中将其声明为内联,则xaml会在属性上调用CommandBindings.Add()。因此,作为一种变通方法,您可以使用DataGridTemplateColumn并提供CellTemplateCellEditingTemplate来查看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>