WPF事件方法正在执行两次



我正在使用wpf事件来显示弹出窗口。由于我的事件方法"AddToBasketClicked"执行了两次,弹出窗口被加载了两次。第一次打开弹出窗口后,在执行操作并关闭窗口后,再次执行事件方法"AddToBasketClicked"后再次加载窗口。

[Export(typeof(IFigureDetailView))]
public partial class FigureDetailsView : IFigureDetailView
{
protected IEventAggregator EventAggregator
{
get { return MefFactory.CompositionContainer.GetExportedValueOrDefault<IEventAggregator>(); }
}
public FigureDetailsView()
{
LoggingManager.Debug("Entered into FigureDetails of FigureDetails.xaml.cs-TMSSS.PIT.Modules.Tempo.Views");
InitializeComponent();
var viewModel = MefFactory.CompositionContainer.GetExportedValueOrDefault<IFigureDetailViewModel>();
ViewModel = viewModel;
viewModel.EventAggregator.GetEvent<AddToBasketClickedEvent>().Subscribe(AddToBasketClicked);
LoggingManager.Debug("Exited from  FigureDetails of FigureDetails.xaml.cs-TMSSS.PIT.Modules.Tempo.Views");
}
private void AddToBasketClicked(Guid figureItem)
{           
LoggingManager.Debug("Entered into AddToBasketClicked of FigureDetails.xaml.cs-TMSSS.PIT.Modules.Tempo.Views");
var addToBasketView = new AddToBasketView();
var viewModel = ViewModel as IFigureDetailViewModel;
if (viewModel != null)
{
addToBasketView.LoadSelectedPart(viewModel.Asset, viewModel.FigureId, figureItem, viewModel.EventAggregator);
}
addToBasketView.WindowStartupLocation = WindowStartupLocation.CenterScreen;
if (addToBasketView.ShowDialog() != true)
{
}
LoggingManager.Debug("Exited from  AddToBasketClicked of FigureDetails.xaml.cs-TMSSS.PIT.Modules.Tempo.Views");
}       
public bool IsFrontView
{
get { return true; }
set { }
}
public IViewModel ViewModel
{
get { return DataContext as IViewModel; }
set { DataContext = value; }
}
}

正如@argaz在评论中提到的,可能是您正在创建两个FigureDetailsView实例,因此创建了两个订阅和两个对话框(最简单的方法是检查日志)。

根据一般理解,允许创建两个FigureDeailsView实例是可以的,在这种情况下,您的"AddToBasket"订阅不应该在这个类中。它应该位于单个实例窗口中,如"Shell"。如果您的项目中没有具体的内容,那么"FigureDetailsView"实际上不应该有显示"AddToBasket"对话框的代码。

希望能有所帮助。

最新更新