2012-04-22 5 views
3

ItemsがItemsSourceコレクションの一部でない場合、ComboBoxのSelectedItemを設定するにはどうすればよいですか?シナリオに続き

<ComboBox ItemsSource="{Binding Path=Names}" 
      SelectedItem="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}"> 
</ComboBox> 

名前はViewModelにでコードを変更する可能性がある文字列のコレクションです。たとえば、名前は男性名(John、Paul、George)または女性名(Mary、Jane、Karen)のいずれかに設定できます。

オスのコレクションがアクティブで、ユーザーが "John"を選択してSelectedItemにするとします。今コレクションは女性の名前に変わります。デフォルトでは、SelectedItemはNullに設定され、Johnはこれ以上表示されません。代わりに、空の文字列が表示されます。

私が達成したいのは、 "John"がSelectedItemとして表示されていることです。これはもはやコレクションに含まれていません。しかし、コレクションの一部ではないので、SelectedItemの色を赤に変更したいと思います。

私はIsEditableプロパティで遊んでいましたが、ComboBoxの外観が変わっているのが好きではありませんでした。とにかくユーザーは手動でテキストを入力するべきではありません。

さまざまなテンプレートとスタイル(Template、ItemTemplate、ItemContainerStyleなど)を使用しようとしましたが、私の好みに合わせて使用​​する方法が見つかりませんでした。

提供されているComboBoxを必要な方法でスタイルすることはできますか、独自のユーザーコントロールを作成する必要はありますか?

編集: 私は私と一緒に暮らすことができる解決策を見つけました。 ViewModelには

<ComboBox IsEditable="True" IsReadOnly="True" 
      ItemsSource="{Binding Path=Names}" 
      Text="{Binding Path=Name}"> 
    <ComboBox.Style> 
    <Style TargetType="{x:Type ComboBox}"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=IsNameInCollection}" Value="False"> 
      <Setter Property="Foreground" Value="Red"/> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </ComboBox.Style> 
    <ComboBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ComboBoxItem}"> 
     <Setter Property="Foreground" Value="Black"/> 
    </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

私はときコレクションが変更プロパティが変更されないことを確認してください。ブール型プロパティIsNameInCollectionは、の名前のプロパティまたはコレクションが変更されたときに更新されます。

+0

基本的に1つのコンボボックスが2つのコンボボックスを使用するようにしたいのですか? – TMan

+0

実際は上記の例では2つしかありません。実際のアプリケーションでは、私はさまざまなコレクションを持っています。 – UdoG

答えて

1

注:これは本当、作業の答え/ソリューションが、あなたは考慮する価値が見つけるかもしれないだけでいくつかの考え:コレクションが変更された場合

まず、SelectedItemは常に置き換えることによって、どちらか(nullに変更されますそれは新しいコレクションまたはクリアリングとそれを補充して)。したがって、オブジェクトのNameプロパティにバインドすると、そのプロパティが内部的にnullでオーバーライドされるのを防ぐことができますか?そうすれば、値がコンボボックスで変更されないことがあります(値をスティックにするためには2WayBindingが必要な場合がありますが、変更イベントを発生させる場合もありますが、これはテストによって異なります)。

第2に、レンダリングを変更する必要があるため、ItemTemplateとカスタムIValueConverterの実装を使用して、異なる色/スタイルの特別なエントリの情報を変換するのが最も簡単な方法です。しかし、これの欠点は、ItemTemplateが、現在選択されているエントリを含むすべてのエントリに通常使用されることです。これに対処するための

一つの方法は、ここで説明するようItemTemplateSelectorを使用することです:http://www.wpftutorial.net/datatemplates.html(セクション「どのようにデータに応じたテンプレートを切り替えるDataTemplateSelectorを使用する」)

もう一つの方法は、コンテナを使用することです普通の文字列の代わりに。そのコンテナは、異なるレンダリングを示すためにブール値を保持する。ブール値はItemTemplateで使用できます。しかし、このシナリオでは、すべての文字列値をラップする必要があります。

第3に、選択した値が現在のリストにない古い値のままで、ユーザーが別の値を選択した場合、ComboBoxはどのように反応しますか。 1つの論理は、古い値が消えるだけですが、ユーザーはそれを選択できないことです。リスト内でまだ使用可能な場合は、それを現在の値のリストに何らかの形で追加する必要がありますが、特別な値であることをマークしてください。いずれの場合も、現行の使用可能リストに従って有効でない値が選択された場合、後で検出するロジックも必要です。

私はこれが有効な解決策を見つけるのに役立つことを願っています。

+0

1.プロパティがnullでオーバーライドされないようにしましたが、コレクションが行ったときにプロパティが変更されなかった場合でも、ComboBoxはそれをそれ以上表示しませんでした。 2.これまでのところ私は自分の好意でテンプレートを使用するのに成功しなかったが、私は引き続き試してみる。 3.その場合、古い値は消える可能性がありますので、それは問題ではありません。 – UdoG

+0

あなたは解決策を提示しませんでしたが、私はあなたに私にいくつかのアイデアを与え、正しい方向に私を押し込んだのであなたの答えを受け入れたとマークしました:-) – UdoG

+0

私は少なくとも少し助けてくれるとうれしいです。 – jCoder

関連する問題