我正在尝试用MVVM模式开发一个WPF程序。我已经创建了两个视图模型。
我的问题是我无法将活动点击机场传递给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));
}
}
#endregionVIEWMODEL 2
让点击的机场
希望你能帮忙!
提前感谢
西里尔
发布于 2019-04-15 14:27:38
很抱歉我的回复太晚了。谢谢你的建议和榜样。我用以下代码解决了我的问题。利用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的许多其他问题,我们很快就会见到您
西里尔
https://stackoverflow.com/questions/55292132
复制相似问题