以下场景:
<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属性或集合更改时更新。