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}" />