掲示板お問い合わせランダムジャンプ



この広告は30日以上更新がないブログに表示されております。 新しい記事を書くことで広告を消すことができます。

Top Index

2011年10月30日
ReadOnly時、TextBoxになるComboBox
VisualStudio2010、WPF、VB2010、.NET4
※注意:TextBox表示としていますが、Labelでもなんでもいいです。個人的に文字列選択はしたいのでTextBoxにしただけです。深い意味はありません。


※2011/11/3 VMへ書き戻しされない不具合を修正。

ComboBoxのReadOnlyプロパティにしても、なぜか編集をロックすることができません。(できるかもしれませんが、見た目はどうみても編集できそう)
ですので、通常であればIsEnabledプロパティを使って編集をロックすると思いますが、IsEnabledだとグレーアウトしてしまう関係上、文字が見づらい・・・

ならば、ControlTempalteを使ってコントロールをごっそり入れ替えてしまいましょう。
完成後の画像:ReadOnly=False
ReadOnlyFalse

完成後の画像:ReadOnly=True
ReadOnlyTrue

以下、ポイントとか。
スタイルを使ってControlTemplateを変更。
内部的にはComboBoxとTextBoxの2つが存在しており、IsReadOnly=False時はComboBoxのみ表示、IsReadOnly=True時はTextBoxのみ表示、としています。
上述の分岐処理は、BooleanVisiblityConverterにて行っています。

※BooleanVisiblityConverterの説明は省略。

ソースコードはこんな感じ。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ROComboBox" >

<!--IsReadOnlyの値をVisibilityに変換-->
<local:BooleanVisiblityConverter x:Key="BooleanVisiblityConv" TrueValue="Visible" FalseValue="Collapsed" />
<local:BooleanVisiblityConverter x:Key="ReverseBooleanVisiblityConv" TrueValue="Collapsed" FalseValue="Visible" />

<!--リードオンリー時テキストボックスで表示されるコンボボックス-->
<Style TargetType="ComboBox" x:Key="ROComboBoxStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBox" >
<StackPanel Margin="0" Orientation="Horizontal" >
<ComboBox
Name="cmb"
ItemsSource="{TemplateBinding ItemsSource}" SelectedItem="{TemplateBinding SelectedItem}"
SelectedIndex="{TemplateBinding SelectedIndex}" SelectedValue="{TemplateBinding SelectedValue}" DisplayMemberPath="{TemplateBinding DisplayMemberPath}"
MinWidth="{TemplateBinding MinWidth}" MaxWidth="{TemplateBinding MaxWidth}" Width="{TemplateBinding Width}"
FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}"
Padding="{TemplateBinding Padding}"
Visibility="{TemplateBinding IsReadOnly, Converter={StaticResource ReverseBooleanVisiblityConv}}"/>
<TextBox
Name="txt"
IsReadOnly="True"
MinWidth="{TemplateBinding MinWidth}" MaxWidth="{TemplateBinding MaxWidth}" Width="{TemplateBinding Width}"
FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}"
Padding="{TemplateBinding Padding}" Margin="0"
Visibility="{TemplateBinding IsReadOnly, Converter={StaticResource BooleanVisiblityConv}}"
Text="{Binding Path=Text, ElementName=cmb}"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

</ResourceDictionary>


使うときはこんな感じ。

<ComboBox Name="cmb1" MinWidth="200" ItemsSource="{Binding Users}" DisplayMemberPath="Name" Style="{StaticResource ROComboBoxStyle}" />


メモ:
後から思ったことですが、グレーアウトして文字が見づらいというのが本題ですので、Style.Triggersを使って文字色を変更でもできるかもしれない(未検証)
[ 投稿者:mk3008 at 15:22 | WPF | コメント(2) | トラックバック(1) ]

この記事へのコメント
これ良いですね♪
こういうの好きです。

私も使わせてもらおう
投稿者: Tech-Bee at 2012-05-09 19:10:25
Re:これ良いですね♪
Tech-Beeさん、コメントありがとうです。

今回の実装でも悪くはないのですが、
ComboBoxのIsEditableプロパティをTrueにするとTextBox化されることを利用することで、
もう少しきれいに実装できそうな気もしてます・・・
試してないのでうまくいくかなかったらごめんなさい。
投稿者: mk3008 at 2012-05-09 22:20:56

この記事へのトラックバック
[WPF]ComboBoxのAutoComplete機能を添付プロパティで実装する
背景ComboBoxは単純なようで奥が深いのか、使いづらい。Binding方法がSelectedValueと、SelectedItemの2つあるのがややこしい。...
投稿者: VB.NETで作る! at 2014-06-23 07:04:09

この記事へのトラックバックURL
http://shinshu.fm/MHz/88.44/a11462/0000373541.trackback

この記事の固定URL
http://shinshu.fm/MHz/88.44/archives/0000373541.html

記事へのコメント
 
簡単演算認証: 9 x 1 + 5 =
計算の答えを半角英数字で入力して下さい。
名前: [必須]
URL/Email:
タイトル:
コメント:
※記事・コメントなどの削除要請はこちら