C#/XAML: ComboBox を選択不可能・読み取り専用(IsReadOnly)にする

C-Sharp XAML WPF

.NET Framework 4.5 が対象です。

HTML ではフォーム系の要素に readonly プロパティを記述するだけで「読み取り専用」の状態になりますが、C# では IsReadOnly を真にするだけだとプルダウンから違う値を選択できてしまいます。

結論からいうと ComboBox を読み取り専用にするには ComboBox に IsReadOnly=TrueIsTabStop=FalseIsHitTestVisible=False を同時に設定する必要があります。

// XAML
<ComboBox
    IsReadOnly="True"
    IsHitTestVisible="False"
    IsTabStop="False" />

MSDN でそれぞれのプロパティを調べてみると…

ComboBox.IsReadOnly(引用 - MSDN

選択専用モードを有効にする値を取得または設定します。選択専用モードでは、コンボボックスの内容は選択可能ですが、編集することはできません。

プロパティ値 型 : System.Boolean ComboBox が読み取り専用である場合は true。それ以外の場合は false。 既定値は、false です。

UIElement.IsHitTestVisible(引用 - MSDN

描画されたコンテンツの一部からヒット テスト結果としてこの要素が返される可能性があるかどうかを宣言する値を取得または設定します。 これは、依存関係プロパティです。

プロパティ値 型 : System.Boolean 少なくとも 1 つのポイントからヒット テスト結果としてこの要素が返される場合は true。それ以外の場合は false。 既定値は true です。

Control.IsTabStop(引用 - MSDN

コントロールがタブ ナビゲーションに含まれるかどうかを示す値を取得または設定します。 プロパティ値 型 : System.Boolean コントロールがタブ ナビゲーションに含まれる場合は true。それ以外の場合は false。 既定値は、true です。

ということでして、IsReadOnly はそもそも選択肢の変更が行えてしまうようです。
そのため、IsHitTestVisible で当たり判定を返さないようにし、IsTabStop で TAB キーでの移動に含まれないようにしなければならないようです。

参考記事

C#、WPF おすすめ書籍

WPF おすすめ書籍#1 C# おすすめ書籍#2