首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF MMV pattern.send活动属性到另一个视图模型

WPF MMV pattern.send活动属性到另一个视图模型
EN

Stack Overflow用户
提问于 2019-03-22 02:40:59
回答 1查看 62关注 0票数 0

我正在尝试用MVVM模式开发一个WPF程序。我已经创建了两个视图模型。

  • 第一个视图模型:显示机场列表。每个机场都可以点击。
  • 第二个视图模型:用于显示单击的机场上的详细信息。

我的问题是我无法将活动点击机场传递给viewmodel2。经过一些研究,我认为我必须使用中介模式来在两个视图模型之间进行通信,但我真的不知道如何实现它。

如果你能帮我编写代码,那就太好了。

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

VIEWMODEL1:

代码语言:javascript
复制
    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

让点击的机场

希望你能帮忙!

提前感谢

西里尔

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-15 14:27:38

很抱歉我的回复太晚了。谢谢你的建议和榜样。我用以下代码解决了我的问题。利用IEventAggregator使用棱镜库

我的服务

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
public class NotamViewModel  : INotifyPropertyChanged
{
    protected readonly IEventAggregator _eventAggregator;

    public NotamViewModel(IEventAggregator ea)
    {
        _eventAggregator = ea;

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


         });
    }
}

最后我的AirportSelectedEvent

代码语言:javascript
复制
public class AirportSelectedEvent : PubSubEvent<AirportModel>
{
}

如果需要的话我希望它能帮到你。

关于WPF的许多其他问题,我们很快就会见到您

西里尔

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55292132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档