WPF MMV模式.将活动属性归为另一个ViewOdel



我正在尝试开发具有MVVM模式的WPF程序。我创建了2个视图模型。

  • 第一个ViewModel:显示机场列表。每个机场都是可单击的。

  • 第二ViewModel:用于在机场单击的机场上显示详细信息。

我的问题是我无法将主动的单击机场传递给ViewModel2。经过一些研究,我认为我必须使用调解器模式在2个视图模型之间进行交流,但是我真的不了解如何实施它。

如果您可以帮助我编码。

您会找到并提取我的代码。

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

获取点击机场

希望您能提供帮助!

预先感谢

cyrille

对不起我的迟到。感谢您的建议和例子。我通过以下代码解决了问题。IAM使用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;

         });
    }
}

最后我的airportedevent

public class AirportSelectedEvent : PubSubEvent<AirportModel>
{
}

我希望在需要时可以为您提供帮助。

很快见到WPF

中的许多其他问题

cyrille

最新更新