Как пользоваться диспетчером в MVVM в WPF привязка элементов в ComboBox
Привет,
Я внедряю одно приложение в WPF MVVM.
Я WPF-приложения и библиотеки DLL класса.
Например в приложении у меня есть 2 combobox х
Я привязываю серверы баз данных к 1-му combobox.
основываясь на выборе 1-го combobox, я связываю 2-й combobox со списком всех баз данных.
моя проблема заключается в том, что когда мы выбираем сервер из 1 - го выпадающего списка, он сохраняет открытое состояние, и приложение некоторое время зависает. Я не могу делать другие операции в это конкретное время.
Мой код XAML ниже :
<ComboBox Grid.Column="2" Grid.Row="1" Grid.ColumnSpan="3" MaxHeight="25" ItemsSource="{Binding Servers}" SelectedValue="{Binding SelectedServer}" Name="cboServer" DataContext="{Binding Source={StaticResource vm}}" /> <ComboBox Grid.Column="2" Grid.Row="2" Grid.ColumnSpan="3" MaxHeight="25" ItemsSource="{Binding Databases}" SelectedValue="{Binding SelectedDatabase}" Name="cboDatabase" DataContext="{Binding Source={StaticResource vm}}"/>
Мой код модели представления выглядит следующим образом:
/// <summary> /// For Servers Properties /// </summary> private ObservableCollection<string> _Servers; private string _SelectedServer; public ObservableCollection<string> Servers { get { return _Servers; } set { _Servers = value; OnPropertyChanged("Servers"); } } public string SelectedServer { get { return _SelectedServer; } set { _SelectedServer = value; OnPropertyChanged("SelectedServer"); _extractInfo.ServerName = !string.IsNullOrEmpty(_SelectedServer) ? _SelectedServer : null; if (!string.IsNullOrEmpty(_extractInfo.ServerName)) GetDatabases(); else Databases = new ObservableCollection<string>(); } } /// <summary> /// For Databases /// </summary> private ObservableCollection<string> _DataBaseList; private string _SelectedDatabase; public ObservableCollection<string> Databases { get { return _DataBaseList; } set { _DataBaseList = value; OnPropertyChanged("Databases"); } } //calling function GetDatabases(): ExtractHelper is located in my DAL Project private ObservableCollection<string> GetDatabases() { try { Databases = new ObservableCollection<string>(ExtractHelper.RequestList(_extractInfo, ExtractHelper.RequestTypes.Databases).AsEnumerable().Select(x => x.DatabaseName)); return Databases; } catch(Exception ex) { MessageBox.Show(ex.Message); } return null; }
Пожалуйста, дайте мне знать, есть ли что-то не так с кодом, если это неправильно, дайте мне знать, как мы достигаем без замораживания приложения
Что я уже пробовал:
Я пробовал использовать диспетчер, как показано ниже.
Когда я использую приведенный ниже код, 1-й combobox закрывается, когда я выбираю сервер, но приложение некоторое время зависает, а затем отображает список баз данных во 2-м combobox.
public string SelectedServer { get { return _SelectedServer; } set { _SelectedServer = value; OnPropertyChanged("SelectedServer"); _extractInfo.ServerName = !string.IsNullOrEmpty(_SelectedServer) ? _SelectedServer : null; if (!string.IsNullOrEmpty(_extractInfo.ServerName)) Application.Current.Dispatcher.BeginInvoke( new Action(() => { GetDatabases(); }), DispatcherPriority.Background, null ); else Databases = new ObservableCollection<string>(); } }