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

Последние 10 лет я использовал WPF с "Диспетчером", чтобы гарантировать, что поток пользовательского интерфейса будет получать уведомления. Я использовал такой код в базовом классе "Модель":

[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.NET.Sdk.WindowsDesktop", который, похоже, зависит от ОС Windows.

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

1 ответ

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);
}
Другие вопросы по тегам