[WPF] コンボボックスにMaxLengthを設定する方法

[WPF] コンボボックスにMaxLengthを設定する方法

[WPF] コンボボックスにMaxLengthを設定する方法

WPFアプリケーションで入力可能なコンボボックスの入力桁数を制限したい場合がありました。テキストボックスの場合は、MaxLengthプロパティを設定するだけですが、コンボボックスにはそれがありません。なので別の方法をとる必要があります。

添付ビヘイビアを使用してMaxLengthを設定する方法があります。ComboBox のテンプレートをいじることで実現します。もちろん添付ビヘイビアを使わず、コードビハインドでも実現できます。

“PART_EditableTextBox” がコンボボックスのテキスト入力の際に利用される TextBox コントロールです。この TextBox の MaxLenght プロパティで桁数の制御を実現します。

MSDN: ComboBox のスタイルとテンプレート

ということで以下はそのサンプルです。

MainWindow.xaml(XAML)

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

    <StackPanel>
        <ComboBox IsEditable="True" local:ComboBoxBehavior.MaxLength="5" />
    </StackPanel>
</Window>

ComboBoxBehavior.cs(Behavior)

using System.Windows;
using System.Windows.Controls;

namespace WpfApplication1
{
    public class ComboBoxBehavior
    {
        public static readonly DependencyProperty MaxLengthProperty =
            DependencyProperty.RegisterAttached("MaxLength", typeof(int),
            typeof(ComboBoxBehavior), new UIPropertyMetadata(1, OnMaxLengthChanged));

        public static int GetMaxLength(DependencyObject obj)
        {
            return (int)obj.GetValue(MaxLengthProperty);
        }

        public static void SetMaxLength(DependencyObject obj, int value)
        {
            obj.SetValue(MaxLengthProperty, value);
        }

        public static void OnMaxLengthChanged
                (DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            var comboBox = obj as ComboBox;
            if (comboBox == null) return;
            comboBox.Loaded +=
                (s, e) =>
                {
                    var textBox = comboBox.Template.FindName("PART_EditableTextBox", comboBox) as TextBox;
                    if (textBox == null) return;

                    textBox.MaxLength = (int)args.NewValue;
                };
        }
    }
}

中身の詳しいことは参考URLを見てください。

参考URL

未分類カテゴリの最新記事