Каков рекомендуемый способ вызвать изменение свойства для настольного приложения, использующего. Net Core в среде MT - PullRequest
0 голосов
/ 27 января 2020

В течение последних 10 лет я использовал WPF с «Диспетчером», чтобы поток пользовательского интерфейса получал уведомления. Я использовал такой код в базовом классе «Model»:

[NotifyPropertyChangedInvocator]
public void RaisePropertyChanged([CallerMemberName] String propertyName = "")
{
    var propertyChanged = PropertyChanged;

    if (propertyChanged != null)
    {

        if (Dispatcher == null) // For console App
        {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        else
        {
            if (Dispatcher.CheckAccess())
            {
                propertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
            else
            {
                Dispatcher.Invoke(new Action(() => propertyChanged(this, new PropertyChangedEventArgs(propertyName))));
            }
        }
    }
}

В этом SO Вопрос некоторые говорят об AsynContext, другой, кажется, добавляет пакет nuget «Microsoft. * 1009». * .Sdk.WindowsDesktop ", который, кажется, Windows зависит от ОС.

Каков рекомендуемый способ сделать эквивалент в новом настольном приложении? Где находится Диспетчер? Есть ли эквивалент? Можем ли мы сохранить независимость нашего кода ОС? Стоит ли нам ждать еще несколько месяцев, пока Microsoft не выпустит независимое от ОС решение?

1 Ответ

0 голосов
/ 27 января 2020

WPF по-прежнему работает только на Windows, а Dispatcher все еще там, поэтому ваша проблема немного неясна.

Если вы разрабатываете библиотеку классов для использования различными клиентскими приложениями, работающими на разных платформы, вы можете скрыть Dispatcher за интерфейсом, который вы затем внедряете на каждой поддерживаемой клиентской платформе.

Интерфейс:

public interface IDispatcher
{
    bool CheckAccess();
    void Invoke(Action action);
}

Просмотреть модель :

public ViewModel(IDispatch dispatcher) { ... }

Реализация WPF:

public class WpfDispatcher : IDispatcher
{
    private readonly Dispatcher _dispatcher;

    public WpfDispatcher(Dispatcher dispatcher) =>
        _dispatcher = dispatcher;

    public bool CheckAccess() => _dispatcher.CheckAccess();

    public void Invoke(Action action) => _dispatcher.Invoke(action);
}
...