4

理由はわかりませんが、同様の質問から適切に機能するソリューションはありません。

aTextBoxにはプロパティ ( ) があり、小文字の入力を大文字に変更するCharacterCasingように設定できることがわかりました。Upperユーザーが入力中に中断されることはなく、Caps Lock と Shift が悪影響を及ぼさず、他の非アルファ文字も悪影響を受けないため、非常にうまく機能します。

問題は、このプロパティを ComboBox に使用するオプションがないことです。その同様の投稿からの解決策は、私にはうまくいかないようです。CharacterCasing プロパティを複製しようとしていますが、ComboBox 用です。添付プロパティであることは気にしません。実際、それは素晴らしいことです。xaml オブジェクトでいくつかの異なるイベントを直接試しましたが、成功しませんでした。

4

1 に答える 1

15

ComboBoxテンプレートはwhen TextBoxis IsEditabletrue を使用します。したがって、テンプレートを置き換えて に設定するかCharacterCasing、名前 ("PART_EditableTextBox") でTextBoxを検索してプロパティを設定する添付プロパティを作成することができます。TextBoxCharacterCasing

添付プロパティ ソリューションの簡単な実装を次に示します。

public static class ComboBoxBehavior
{

    [AttachedPropertyBrowsableForType(typeof(ComboBox))]
    public static CharacterCasing GetCharacterCasing(ComboBox comboBox)
    {
        return (CharacterCasing)comboBox.GetValue(CharacterCasingProperty);
    }

    public static void SetCharacterCasing(ComboBox comboBox, CharacterCasing value)
    {
        comboBox.SetValue(CharacterCasingProperty, value);
    }

    // Using a DependencyProperty as the backing store for CharacterCasing.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty CharacterCasingProperty =
        DependencyProperty.RegisterAttached(
            "CharacterCasing",
            typeof(CharacterCasing),
            typeof(ComboBoxBehavior),
            new UIPropertyMetadata(
                CharacterCasing.Normal,
                OnCharacterCasingChanged));

    private static void OnCharacterCasingChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        var comboBox = o as ComboBox;
        if (comboBox == null)
            return;

        if (comboBox.IsLoaded)
        {
            ApplyCharacterCasing(comboBox);
        }
        else
        {
            // To avoid multiple event subscription
            comboBox.Loaded -= new RoutedEventHandler(comboBox_Loaded);
            comboBox.Loaded += new RoutedEventHandler(comboBox_Loaded);
        }
    }

    private static void comboBox_Loaded(object sender, RoutedEventArgs e)
    {
        var comboBox = sender as ComboBox;
        if (comboBox == null)
            return;

        ApplyCharacterCasing(comboBox);
        comboBox.Loaded -= comboBox_Loaded;
    }

    private static void ApplyCharacterCasing(ComboBox comboBox)
    {
        var textBox = comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox;
        if (textBox != null)
        {
            textBox.CharacterCasing = GetCharacterCasing(comboBox);
        }
    }

}

そして、これを使用する方法は次のとおりです。

    <ComboBox ItemsSource="{Binding Items}"
              IsEditable="True"
              local:ComboBoxBehavior.CharacterCasing="Upper">
        ...
于 2010-10-15T19:12:57.683 に答える