У меня есть небольшая проблема с зависанием моего пользовательского интерфейса, хотя я использую Dispatcher, и, прежде чем я продолжу, мне интересно, так ли я обрабатываю поиск данных.
Прямо сейчас у меня есть главное окно, создающее View и ViewModel. Затем внутри нового потока (используя Dispatcher) он устанавливает View.DataContext = ViewModel. Очень большая коллекция ObservableCollection создается лениво, когда срабатывает привязка, вызывающая замедление. Однако кажется, что некоторые другие элементы пользовательского интерфейса, которые должны отображаться до этого замедления, на самом деле не отображаются.
private void ButtonClick(Object sender, RoutedEventArgs e)
{
MyView view = new MyView();
MyViewModel vm = new MyViewModel();
TabItem tabItem = new TabItem();
tabItem.Header = "MyView";
tabItem.Content = view;
MyTabCollection.Items.Add(tabItem);
Window working = new Working();
working.Show();
ThreadStart thread = delegate()
{
DispatcherOperation operation = Dispatcher.BeginInvoke(
DispatcherPriority.Normal,
new Action(delegate()
{
view.DataContext = vm;
((FrameworkElement)view.Parent).Focus();
working.Close();
}
)
);
};
Thread theThread = new Thread(thread);
theThread.Start();
}
Это в основном говорит о том, что предполагается создать представление и модель представления, а затем добавить представление в коллекцию вкладок, которая у меня есть (что означает, что она должна отображать как минимум новую вкладку). Кроме того, должно появиться окно «Работает...». После этого отдельный поток должен связать ViewModel с представлением, сфокусироваться на этой вкладке и закрыть рабочее окно. Проблема в том, что первая часть не отображается, пока все не будет сделано; Вкладка не отображается, и рабочее окно не отображается до тех пор, пока новый поток фактически не завершится (что приводит к немедленному отображению/закрытию рабочего окна). Я предполагаю, что это может быть связано с тем, как я извлекаю данные, но я не уверен. Вот как это делается:
- Создать представление
- Создать ViewModel
- Создайте TabItem с Content, установленным в View, и добавьте TabItem в TabCollection.
- Создать/Показать окно "Работа..."
- Диспетчер: Установите View.DataContext = ViewModel. Это событие запускает DataBindings, которые, в свою очередь, захватывают ObservableCollection. Поскольку OC создается лениво, сейчас он создается (это узкое место). ‹-- Это портит мой отдельный поток/диспетчер?
- Диспетчер: установите фокус на вкладку
- Закройте окно "Работает..."