我正在尝试开发具有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