Как зарегистрировать обработчик сообщений до вызова блокировки ShowDialog ()?
Я используюПосланник класса для того, чтобы отправить данные между моделями представления. ЕстьAppView
в нем размещены два основных представления в элементе управления контентом, и до сих пор не было проблем с отправкой / получением данных таким способом.
Выпуск:
Теперь я добавилProductView
это показывает отдельный диалог к AppView. Но когда я звонюMessenger.Default.Send<ProductModel>(SelectedProduct);
после вызова .ShowDetailDialog () это блокируетSend
вызов кода, пока диалог не закроется.
Я попробовал наоборот, вызываяSend
сначала код, а затем открыв диалоговое окно. Но это означает, что обработчик сообщений в принимающей виртуальной машине не регистрируется вовремя перед отправкой сообщения.
Кто-нибудь знает решение, чтобы диалоговое окно не блокировало отправку вызова? Или в качестве альтернативы зарегистрировать обработчик сообщений ProductVM до отправки сообщения и отображения диалогового окна?
Ниже приведена сводка связанных классов:
CustomerOrdersVM (отправка кода):
private void EditOrder(object obj)
{
_dialogService.ShowDetailDialog();
Messenger.Default.Send<ProductModel>(SelectedProduct);
}
ProductVM (получение кода):
public ProductViewModel()
{
Messenger.Default.Register<ProductModel>(this, OnSelectedProductReceived);
}
DialogService:
class DialogService : IDialogService
{
Window productView = null;
public DialogService()
{
}
public void ShowDetailDialog()
{
productView = new ProductView();
productView.ShowDialog();
}
}
AppVM (основные виртуальные машины зарегистрированы, ProductVM не зависит от этой виртуальной машины):
public ApplicationViewModel()
{
// Add available pages
PageViewModels.Add(new CustomerDetailsViewModel(customerDataService, countryDataService, dialogService));
PageViewModels.Add(new CustomerOrdersViewModel(orderDataService, dialogService));
PageViewModels.Add(new OrderStatisticsViewModel());
// Set starting page
CurrentPageViewModel = PageViewModels[0];
}
AppView: (содержит представления AppVM):
<Window x:Class="MongoDBApp.Views.ApplicationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:MongoDBApp.Views"
xmlns:vm="clr-namespace:MongoDBApp.ViewModels">
<Window.Resources>
<DataTemplate DataType="{x:Type vm:CustomerDetailsViewModel}">
<views:CustomerDetailsView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:CustomerOrdersViewModel}">
<views:CustomerOrdersView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:OrderStatisticsViewModel}">
<views:OrderStatisticsView />
</DataTemplate>
</Window.Resources>
<Window.DataContext>
<vm:ApplicationViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height=".07*" />
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<TabControl Grid.Row="1"
ItemsSource="{Binding PageViewModels}"
SelectedItem="{Binding CurrentPageViewModel}"
TabStripPlacement="Top">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<Setter Property="IsEnabled" Value="{Binding IsEnabled}" />
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
</Grid>
</Window>