【发布时间】:2012-04-22 12:03:45
【问题描述】:
以下场景:
<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 中,我确保 Name 属性在 Names 集合更改时不会更改。布尔属性 IsNameInCollection 将在 Name 属性或集合更改时更新。
【问题讨论】:
-
所以您基本上希望一个组合框充当使用 2 个组合框?
-
实际上在上面给出的例子中只有两个。在实际应用中,我有许多不同的集合。
标签: wpf colors combobox selecteditem