WPF MMV pattern.send активное свойство другому Viewodel - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь разработать программу WPF с шаблоном MVVM. Я создал 2 модели просмотра.

  • Первая модель просмотра: отобразить список аэропортов. Каждый аэропорт кликабелен.

  • Вторая видовая модель: используется для отображения подробной информации об аэропорте, по которому щелкнули.

Моя проблема в том, что я не могу передать активный аэропорт клика в viewmodel2. После некоторого исследования я думаю, что должен использовать шаблон-посредник для связи между двумя моделями представлений, но я действительно не понимаю, как его реализовать.

Будет очень приятно, если вы поможете мне в кодировании.

Вы найдете и извлечете мой код.

VIEWMODEL1:

    public AirportViewModel()
    {
        Airports = new ObservableCollection<AirportModel>(GetData.GetAirportData());//LOAD AIRPORTS FROM XML FILE
        GetAirportIdCommand = new RelayCommand(GetAirportIdExecute, GetAirportIdCanExeucte);
    }

    public static ObservableCollection<AirportModel> Airports { get; set; }

    private AirportModel selectAirport; // AIRPORT CLICK AND NEED TO BE SEND To VIEWMODEL2

    public AirportModel SelectAirport
    {
        get { return selectAirport; }
        set
        {
            if (value != selectAirport)
            { 
                selectAirport = value;
                OnPropertyChanged("SelectAirport");
            }
         }
    }

    public RelayCommand GetAirportIdCommand { get; set; }

    public void GetAirportIdExecute(object parameter)   // COMMAND TO SELECT AN AIRPORT
    {          
        int IdSelectAirport = int.Parse(parameter.ToString());
        SelectAirport = Airports[IdSelectAirport];
        AirportDataWindowViewModel.AirportDataWindowModel.WidthNotam = 500;
    }

    public bool GetAirportIdCanExeucte(object parameter)
    {
        //Bouton toujours actif
        return true;
    }
    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion

VIEWMODEL 2

получить выбранный аэропорт

Надеюсь, вы можете помочь!

Заранее спасибо

Сирил

1 Ответ

0 голосов
/ 15 апреля 2019

извините за мой поздний ответ.Спасибо за ваш совет и пример.Я решил свою проблему с помощью следующего кода.Я использую библиотеку Prism с IEventAggregator

Мой сервис

internal sealed class ApplicationService
{
    private ApplicationService() { }

    private static readonly ApplicationService _instance = new ApplicationService();

    internal static ApplicationService Instance { get { return _instance; } }

    private Prisms.IEventAggregator _eventAggregator;
    internal Prisms.IEventAggregator EventAggregator
    {
        get
        {
            if (_eventAggregator == null)
            {
                _eventAggregator = new Prisms.EventAggregator();
            }


            return _eventAggregator;
        }
    }

, затем мой первый ViewModel, который опубликует SelectAirport

public class AirportViewModel :  INotifyPropertyChanged
{
    protected readonly IEventAggregator eventAggregator;


    public AirportViewModel(IEventAggregator EventAggregator)
    {
        //Liste des aéroports a suivre           
        Airports = new ObservableCollection<AirportModel>(GetData.GetAirportData());

        //Clique sur un aéroport
        GetAirportIdCommand = new RelayCommand(GetAirportIdExecute,GetAirportIdCanExeucte);

        #region Telechargement météo

        GetAllWeather GetAllWeather = new GetAllWeather(Airports);

        #endregion


        this.eventAggregator = EventAggregator;

    }
 //Property SelectAirport
    public AirportModel SelectAirport
    {
        get { return selectAirport; }
        set
        {
           selectAirport = value;
          //Publish the property SelectAirport 
          eventAggregator.GetEvent<AirportSelectedEvent> ().Publish(selectAirport);
          OnPropertyChanged("SelectAirport");

        }
    }
}

, затем мой второй ViewModel, который получит SelectAirport

public class NotamViewModel  : INotifyPropertyChanged
{
    protected readonly IEventAggregator _eventAggregator;

    public NotamViewModel(IEventAggregator ea)
    {
        _eventAggregator = ea;

        _eventAggregator.GetEvent<AirportSelectedEvent>()
         .Subscribe((_selectAirport) =>
         {
          this.SelectAirport = _selectAirport;


         });
    }
}

И, наконец, мой AirportSelectedEvent

public class AirportSelectedEvent : PubSubEvent<AirportModel>
{
}

Я надеюсь, что он может помочь вам в случае необходимости.

Скоро увидимся с множеством других вопросов в WPF

Сирил

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