Многопоточность WPF C#

#c# #wpf #multithreading #mvvm

#c# #wpf #многопоточность #mvvm

Вопрос:

Все еще изучаю MVVM и многопоточность и столкнулся с чем-то, что я не могу понять.

Пользователи получают доступ к списку кандидатов через Datagrid для своего конкретного местоположения филиала. Они могут нажать кнопку в datagrid, чтобы получить SelectedItem, чтобы открыть более подробное представление этого приложения.

В первый раз, когда они открывают это представление, данные верны; однако при любом дальнейшем открытии представления исходные данные по-прежнему отображаются. Информация о втором кандидате не отображается в представлении, если приложение не закрыто и не открыто снова.

Я прочитал, что ViewModel хранится в памяти, и я подумал, может быть, потоковая обработка обеспечит решение. Я использовал следующий код, чтобы попытаться именно это; однако, безуспешно.

Может кто-нибудь, пожалуйста, указать мне правильное направление относительно того, как я могу справиться с этой ситуацией, или если я подхожу к этому совершенно неправильно. 🙂

Спасибо, что уделили мне время.

 private void NewWindowHandler(object sender, RoutedEventArgs e)
    {
        try
        {
            Craig_Tools.Data.Globals.selectedAppID = Convert.ToInt32(appIDTextBox.Text);

            Thread newWindowThread = new Thread(delegate()
            {
                Window tempWindow = new Window
                {
                    Title = "Display Applicant",
                    Content = new Craig_Tools.ApplicationTrackingSystem.userControls.atDisplay(),
                    SizeToContent = SizeToContent.WidthAndHeight,
                    //ResizeMode = ResizeMode.NoResize
                };

                tempWindow.Show();
                System.Windows.Threading.Dispatcher.Run();
            });

            newWindowThread.SetApartmentState(ApartmentState.STA);
            newWindowThread.Start();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Error opening Applicant Display");
        }
    }
  

Я также попробовал следующее.

   private void NewWindowHandler(object sender, RoutedEventArgs e)
    {
        try
        {
            Craig_Tools.Data.Globals.selectedAppID = Convert.ToInt32(appIDTextBox.Text);

            //create and show window
            atDisplay newView = new atDisplay();
            ViewModels.displayViewModel viewModel = new ViewModels.displayViewModel();
            newView.DataContext = viewModel;    
            newView.Title = "Applicant ID: "   Craig_Tools.Data.Globals.selectedAppID;

            newView.Show();

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Error opening Applicant Display");
        }
    }
  

Что я выяснил с помощью Visual Studio debugger, так это то, что ViewModel никогда не выполняется при попытке открыть информацию для второго заявителя. Кажется, что он просто захватывает данные, которые находятся в памяти.

Комментарии:

1. Когда у вас возникают проблемы с тем, что значения вещей не соответствуют вашим ожиданиям, потоковая обработка является полной противоположностью решению. Это как бы за гранью противоположного. Это все равно, что повернуть на 180 градусов до 11.

2. Что такое ‘appIDTextBox’ и какова его связь с DataGrid? Нам также нужно было бы посмотреть, что делает ваш класс Craig_Tools (особенно реализации Craig_Tools.Data.Globals.selectedAppID и Craig_Tools. Система отслеживания приложений.Пользовательские контроллеры. При отображении, поскольку они, по-видимому, должны совместно использовать какое-то состояние).

3. appIDTextBox — это текстовое поле на начальном дисплее, которому присваивается идентификатор приложения при выборе элемента в сетке данных.

4. Craig_Tools.Data.Globals.selectedAppID — это просто глобально доступное целое число, которому я могу присвоить идентификатор приложения для извлечения в других представлениях. В этом случае, когда они нажимают кнопку для просмотра подробного представления приложения, он присваивает AppID Craig_Tools.Data.Globals.selectedAppID.

5. Craig_Tools. Система отслеживания приложений.Пользовательские контроллеры. atDisplay — это представление.