C# 如何将wpf自动完成框转换为所有大写输入

C# 如何将wpf自动完成框转换为所有大写输入,c#,wpf,xaml,wpf-controls,wpftoolkit,C#,Wpf,Xaml,Wpf Controls,Wpftoolkit,我有一个AutoCompleteBox作为DataGrid列类型。像这样: <DataGridTemplateColumn> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Thing, UpdateSourceTrigger=PropertyChanged}" />

我有一个
AutoCompleteBox
作为
DataGrid
列类型。像这样:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Thing, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>

    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <SLToolkit:AutoCompleteBox Text="{Binding Path=Thing,
                                              UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
我试过这个:

<SLToolkit:AutoCompleteBox Text="{Binding Path=Thing,
                                          UpdateSourceTrigger=PropertyChanged}"
                           TextChanged="AutoComplete_TextChanged" />
这种方法很有效,只是它写得倒着。当用户输入一个字符时,光标返回到框的开头,因此下一个单词位于前一个单词的前面。如果我写“示例”,我会看到“ELPMAXE”


有什么想法吗?

我解决了一个类似的问题,我只想在文本框中输入数字,所以我使用了一种行为。如果输入非数字,则删除该字符。我还使用了交互性库,它使用System.Windows.interactivity.dll(如果您没有将此dll作为blend sdk的一部分,请将其导入到您的项目中)

以下是简化的XAML:

    <Window x:Class="Sample.SampleWindow"
            xmlns:main="clr-namespace:MySampleApp"
            xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
            Title="Sample"
            Height="800"
            Width="1025"
            >
                         <Grid>
                            <TextBox Text="{Binding Path=Entry, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                     Width="30"
                                     MaxLength="4"
                                     HorizontalAlignment="Left">
                                <i:Interaction.Behaviors>
                                    <main:KeyPressesWithArgsBehavior 
KeyUpCommand="{Binding KeyUpFilterForUpperCaseSymbols}" />
                                </i:Interaction.Behaviors>
                            </TextBox>
                         </Grid>
    </Window>

private void AutoComplete_TextChanged(object sender, RoutedEventArgs e)
{
     AutoCompleteBox box = sender as AutoCompleteBox;
     if (box == null) return;
     box.Text = box.Text.ToUpper();
}
    <Window x:Class="Sample.SampleWindow"
            xmlns:main="clr-namespace:MySampleApp"
            xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
            Title="Sample"
            Height="800"
            Width="1025"
            >
                         <Grid>
                            <TextBox Text="{Binding Path=Entry, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                     Width="30"
                                     MaxLength="4"
                                     HorizontalAlignment="Left">
                                <i:Interaction.Behaviors>
                                    <main:KeyPressesWithArgsBehavior 
KeyUpCommand="{Binding KeyUpFilterForUpperCaseSymbols}" />
                                </i:Interaction.Behaviors>
                            </TextBox>
                         </Grid>
    </Window>
public class KeyPressesWithArgsBehavior : Behavior<UIElement>
{
    #region KeyDown Press DependencyProperty
    public ICommand KeyDownCommand
    {
        get { return (ICommand) GetValue(KeyDownCommandProperty); }
        set { SetValue(KeyDownCommandProperty, value); }
    }

    public static readonly DependencyProperty KeyDownCommandProperty =
        DependencyProperty.Register("KeyDownCommand", typeof (ICommand), typeof (KeyPressesWithArgsBehavior));

    #endregion KeyDown Press DependencyProperty

    #region KeyUp Press DependencyProperty

    public ICommand KeyUpCommand
    {
        get { return (ICommand) GetValue(KeyUpCommandProperty); }
        set { SetValue(KeyUpCommandProperty, value);}
    }

    public static readonly DependencyProperty KeyUpCommandProperty = 
        DependencyProperty.Register("KeyUpCommand", typeof(ICommand), typeof (KeyPressesWithArgsBehavior));

    #endregion KeyUp Press DependencyProperty

    protected override void OnAttached()
    {
        AssociatedObject.KeyDown += new KeyEventHandler(AssociatedUIElementKeyDown);
        AssociatedObject.KeyUp += new KeyEventHandler(AssociatedUIElementKeyUp);
        base.OnAttached();
    }

    protected override void OnDetaching()
    {
        AssociatedObject.KeyDown -= new KeyEventHandler(AssociatedUIElementKeyDown);
        AssociatedObject.KeyUp -= new KeyEventHandler(AssociatedUIElementKeyUp);
        base.OnDetaching();
    }

    private void AssociatedUIElementKeyDown(object sender, KeyEventArgs e)
    {
        if (KeyDownCommand != null)
        {
            ObjectAndArgs oa = new ObjectAndArgs {Args = e, Object = AssociatedObject};
            KeyDownCommand.Execute(oa);
        }
    }

    private void AssociatedUIElementKeyUp(object sender, KeyEventArgs e)
    {
        if (KeyUpCommand != null)
        {
            KeyUpCommand.Execute(AssociatedObject);
        }
    }
}
    public ICommand KeyUpFilterForUpperCaseSymbolsCommand
    {
        get
        {
            if (_keyUpFilterForUpperCaseSymbolsCommand== null)
            {
                _keyUpFilterForUpperCaseSymbolsCommand= new RelayCommand(KeyUpFilterForUpperCaseSymbols);
            }
            return _keyUpFilterForUpperCaseSymbolsCommand;
        }
    }
    private void KeyUpFilterForUpperCaseSymbols(object sender)
    {
        TextBox tb = sender as TextBox;
        if (tb is TextBox)
        {
            // check for a lowercase character here
            // then modify tb.Text, to exclude that character.
            // Example: tb.Text = oldText.Substring(0, x);
        }
    }