合肥网站制作需seo推广 课程
WPF ComboBox首次加载不触发SelectionChanged事件
问题
在开发项目时,使用多个ComboBox控件,并且ComboBox控件值相互关联,SelectionChanged直接写在xaml里面,并且绑定了SelectedIndex值时,当调用窗口的时候,会直接触发SelectionChanged事件,导致数据显示和实际的不一致。这时就需要修改为,首次不触发ComboBox的SelectionChanged事件。
<ComboBox x:Name="MyComboBox" ItemsSource="{Binding DeviceTypeList}"SelectedIndex="{Binding SelectedDeviceIndex}"SelectionChanged="ComboBox_SelectionChanged">
在xaml中直接绑定 SelectionChanged 事件,当对SelectedIndex进行赋值时,就会触发SelectionChanged 事件。
解决方法
方法一:通过代码后台延迟订阅事件,达到首次不触发SelectionChanged事件。
如果允许使用代码后台,可以在Loaded事件后再订阅事件。
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();Loaded += OnWindowLoaded;}private void OnWindowLoaded(object sender, RoutedEventArgs e){MyComboBox.SelectionChanged += OnSelectionChanged;}private void OnSelectionChanged(object sender, SelectionChangedEventArgs e){// 实际处理逻辑}
}
简单快捷,但需在代码后台处理,适合小型项目或快速实现。
方法二:ViewModel中通过标志位控制
在ViewModel中添加标志位,仅在初始化完成后处理逻辑。
public class MyViewModel : INotifyPropertyChanged
{private bool _isInitialized;public ObservableCollection<string> Items { get; } = new ObservableCollection<string>();private string _selectedItem;public string SelectedItem{get => _selectedItem;set{_selectedItem = value;OnPropertyChanged();if (_isInitialized){// 实际处理逻辑(仅在初始化后执行)HandleSelectionChanged();}}}public MyViewModel(){// 模拟初始化数据Items.Add("Item1");Items.Add("Item2");_selectedItem = Items.First();// 标记初始化完成_isInitialized = true;}private void HandleSelectionChanged(){// 处理选择变化}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string name = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));}
}
xaml绑定
<ComboBox ItemsSource="{Binding Items}"SelectedItem="{Binding SelectedItem}" />