次のシナリオ:
<ComboBox ItemsSource="{Binding Path=Names}"
SelectedItem="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}">
</ComboBox>
Namesは、ViewModelのコードによって変更される可能性のある文字列コレクションです。たとえば、名前は男性の名前(John、Paul、George)または女性の名前(Mary、Jane、Karen)のいずれかに設定できます。
男性のコレクションがアクティブで、ユーザーが「John」を選択してSelectedItemにしたとします。これで、コレクションが女性の名前に変わります。デフォルトでは、SelectedItemはNullに設定され、Johnは表示されなくなります。代わりに、空の文字列が表示されます。
私が達成したいのは、「John」はコレクションに含まれていなくても、SelectedItemとして表示されていることです。ただし、コレクションの一部ではないため、SelectedItemの色を赤に変更したいと思います。
IsEditableプロパティをいじってみましたが、ComboBoxの外観の変化が気に入らなかった。とにかく、ユーザーは手動でテキストを入力できないようにする必要があります。
さまざまなテンプレートとスタイル(たとえば、Template、ItemTemplate、ItemContainerStyle)を使用しようとしましたが、自分の好みに合わせて使用する方法が見つかりませんでした。
提供されたComboBoxを必要な方法でスタイル設定することは可能ですか、それとも独自のユーザーコントロールを作成する必要がありますか?
編集:私は私が一緒に暮らすことができる解決策を見つけました。
<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>
ViewModelでは、 Namesコレクションが変更されたときにNameプロパティが変更されないことを確認します。ブールプロパティIsNameInCollectionは、 Nameプロパティまたはコレクションが変更されたときに更新されます。