Должен ли я связываться со свойством SharedService в WPF Prism - PullRequest
0 голосов
/ 30 мая 2018

Я использовал SharedService (Prism) для получения данных между двумя модулями.В SharedService я поместил строковое свойство с именем AdapterName.Предположим, что в модуле A есть ViewAViewModel, а в модуле B - ViewBViewModel

public class ViewAViewModel : BindableBase {
    private string _adapterNameA;
    public string AdapterNameA
    {
        get { return _adapterNameA; }
        set { SetValue (ref _adapterNameA, value); }
    }

    private ISharedService _sharedService;
    public ISharedService SharedService {
        get { return _sharedService; }
        set { SetValue (ref _sharedService, value); }
    }

    public ViewAViewModel (ISharedService sharedService) {
        _sharedService = sharedService;
    }
}

public class ViewBViewModel : BindableBase {
    private string _adapterNameB;
    public string AdapterNameB {
        get { return _adapterNameB; }
        set { SetValue (ref _adapterNameB, value); }
    }

    private ISharedService _sharedService;
    public ISharedService SharedService {
        get { return _sharedService; }
        set { SetValue (ref _sharedService, value); }
    }

    public ViewBViewModel (ISharedService sharedService) {
        _sharedService = sharedService;
    }
}

public interface ISharedService {
    string AdapterName { get; set; }
}

public class SharedService : BindableBase, ISharedService {
    private string _adapterName;
    public string AdapterName {
        get { return _adapterName; }
        set { SetValue (ref _adapterName, value); }
    }
}

У меня есть текстовое поле и ViewA, и ViewB, и я хочу, чтобы значение в текстовом поле в ViewA всегда было таким же, как в ViewB.Так что мне следует изменить значение SharedService.AdapterName в AdapterNameA get, set (аналогично AdapterNameB)?

public string AdapterNameA
{
    get { 
        _adapterNameA = SharedService.AdapterName;
        return _adapterNameA;
        }
    set { 
        SetValue (ref _adapterNameA, value); 
        SharedService.AdapterName = value;
    }
}

или связать напрямую со свойством SharedService

Text = "{Binding Path=SharedService.AdapterName, UpdateSourceTrigger=PropertyChanged}"

или другим способом?(Я пытаюсь сделать WPF MVVM с Призмой)

1 Ответ

0 голосов
/ 30 мая 2018

Если совместно используемая служба реализует событие INotifyPropertyChanged и генерирует уведомления об изменениях, вы можете напрямую связать ее свойство при условии, что вы действительно хотите предоставить службу через свойство моделей представления.Возможно, вы не захотите делать это в зависимости от того, что делает сервис.

Если вы не хотите предоставлять сервис, вам остается создать свойства оболочки в моделях представления.Это обеспечивает лучшую инкапсуляцию за счет некоторых дополнительных строк кода для свойств оболочки (если у вас их несколько).

Но здесь нет настоящих правильных или неправильных.Вам нужно будет решить, какое решение наиболее целесообразно для вас в этом конкретном сценарии.

В общем, служба должна абстрагироваться и позаботиться о получении некоторых результатов откуда-то и передать их обратно в представление.модель.Обычно он не реализует событие INotifyPropertyChanged и предоставляет свойства, с которыми представления напрямую связаны.Ответственность модели представления заключается в том, чтобы определять и предоставлять эти свойства.Модель представления все еще может использовать сервис для заполнения свойств.

...