如何设置ComboBoxItem属性,实现ComboBox选中项隐藏并解决绑定问题
问题修复方案
核心问题原因
SortList类未实现INotifyPropertyChanged接口,属性值变更后无法通知UI更新- XAML 中
ComboBoxItem的绑定路径错误,ComboBoxItem的上下文本身就是单个SortList对象,无需加Items.前缀 SortList初始化时错误将所有项的IsSelectable设为false,且选中新项时未重置旧选中项的状态- XAML 中
Style的BasedOn属性存在拼写错误,ComboBoxIem应为ComboBoxItem
代码修改
1. 修正 SortList 类,实现属性变更通知
using System.ComponentModel; using System.Runtime.CompilerServices; public class SortList : INotifyPropertyChanged { private string _key; public string Key { get => _key; set { _key = value; OnPropertyChanged(); } } private string _value; public string Value { get => _value; set { _value = value; OnPropertyChanged(); } } private bool _isSelectable; public bool IsSelectable { get => _isSelectable; set { _isSelectable = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 修正 ViewModel 逻辑
private void InitSortList() { ObservableCollection<SortList> sl = new ObservableCollection<SortList>(); foreach(var i in defaultSortList) { SortList s = new SortList(); s.Key = i.Key.ToString(); s.Value = i.Value.ToString(); // 初始状态所有项都可选择 s.IsSelectable = true; sl.Add(s); } _items = sl; } private ObservableCollection<SortList> _items = new ObservableCollection<SortList>(); public ObservableCollection<SortList> Items { get => _items; } private SortList _selectedSort; public SortList SelectedItem { get => _selectedSort; set { if(_selectedSort != value) { // 重置之前选中项的可选状态 if(_selectedSort != null) { _selectedSort.IsSelectable = true; } _selectedSort = value; // 新选中项设为不可选 if(_selectedSort != null) { _selectedSort.IsSelectable = false; } PropertyChanged(this, new PropertyChangedEventArgs(nameof(SelectedItem))); } } }
3. 修正 XAML 代码
如果需要禁用已选中项,写法如下:
<ComboBox Header="Sort 1" HorizontalAlignment="Stretch" Name="Sort_1" ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" SelectedValuePath="Key" DisplayMemberPath="Value"> <ComboBox.ItemContainerStyle> <Style TargetType="ComboBoxItem" BasedOn="{StaticResource {x:Type ComboBoxItem}}"> <Setter Property="IsEnabled" Value="{Binding IsSelectable}" /> </Style> </ComboBox.ItemContainerStyle> </ComboBox>
如果需要隐藏已选中项,修改Setter即可,WPF 原生支持 BooleanToVisibilityConverter 直接使用:
<!-- 先在页面/窗口资源中声明转换器 --> <Window.Resources> <BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" /> </Window.Resources> <!-- 然后修改Style中的Setter --> <Setter Property="Visibility" Value="{Binding IsSelectable, Converter={StaticResource BoolToVisibilityConverter}}" />
额外说明
如果不需要后台的 comboSelectionChanged 事件逻辑可以直接删除,MVVM 模式下通过绑定即可完成所有逻辑,无需后台事件耦合。
内容的提问来源于stack exchange,提问作者gby
相关产品推荐
相关产品推荐

