Обновление C # WPF GUI при изменении другой нити и переменной библиотеки - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь обновить графический интерфейс при изменении значения словаря в WPF, MVVM.По сути, я получил следующий словарь по отдельным потокам и библиотеке / проекту:

 public static Dictionary<string, string> ProgressStageDictionary = new Dictionary<string, string>
    {
        {"Data Initiation", ""},
        {"Data Import", ""}
    };

Дочерняя библиотека / проект - это отдельное приложение, которое не знает о графическом интерфейсе и не имеет его.Я пытаюсь обновить GUI из него. У меня возникла бы проблема со ссылкой на проект как ссылка на проект GUI на дочерний проект, а не наоборот.Вот почему я не могу вызвать GUI из этой библиотеки, используя, например, DispatcherHelper.CheckBeginInvokeOnUI .

Однако GUI как основной поток должен знать о дочерних потоках.Поэтому для достижения этого я создал INotifyPropertyChanged Событие:

public class ViewModelBase: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged([CallerMemberName]string caller = null)
        {
            var handler = PropertyChanged;
            handler?.Invoke(this, new PropertyChangedEventArgs(caller));
        }
    }

Я связал его с моей переменной графического интерфейса MVVM

        private List<StepItem> _stepItems { get; set; }
        public List<StepItem> StepItems
        {
            get => _stepItems;
            set
            {
                _stepItems = value;
                OnPropertyChanged(nameof(Child.ProgressStageDictionary));
                Thread.Sleep(250);
            }
        }

Мой графический интерфейсдолжен обновляться всякий раз, когда Child.ProgressStageDictionary обновляется.Тем не менее, мой графический интерфейс не ловит это.Что мне нужно изменить, чтобы иметь возможность просматривать обновления переменных в дочерних потоках?

1 Ответ

0 голосов
/ 25 января 2019

Я нашел ответ, как это сделать. Я не мог понять, почему мои наблюдатели не ловят обновления, но мне удается сделать это с помощью делегаторов. В основном потоке вычислений я создаю метод, который отправляет обновление в поток GUI:

 public void SuperStepProgressMethod(Dictionary<string, string> stepDictionary)
        {
            DispatcherHelper.CheckBeginInvokeOnUI(
                () =>
                {
                    // Set step item list
                    StepItems = StepProgressHandler.UpdateStepList(stepDictionary);
                });
        }

После этого, когда я вызываю метод Project, я делегирую метод MainViewModel как действие для него.

 public static void Run(
        Action<Dictionary<string, string>> superStepProgressMethod)
    {

        ProgressStageDictionary["Data Initiation"] = Initiation();
        superStepProgressMethod.Invoke(ProgressStageDictionary);#
    }

При использовании этого решения за кулисами темы обновляются / работают в следующем порядке:

Нить GUI -> Нить расчета -> Отдельная нить проекта -> Нить GUI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...