InteractionRequest Raise 未显示弹出窗口(Prism - Interactivity)
InteractionRequest Raise not showing up the Popup (Prism - Interactivity)
我正在使用 Prism 实现一些交互性,以便在按下按钮后在弹出窗口中显示一个表单。但是弹窗没有显示。
这是我定义按钮的视图 (ContactsView):
<i:Interaction.Triggers>
<prism:InteractionRequestTrigger SourceObject="{Binding ContactInteractionRequest, Mode=OneWay}">
<prism:PopupWindowAction>
<prism:PopupWindowAction.WindowContent>
<views:AddContactPopupView />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
</i:Interaction.Triggers>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<DockPanel Grid.Row="0" Background="#D6D6DC">
<ToolBar Style="{StaticResource ModuleToolBarStyle}">
<TextBlock Margin="10,0,0,0" Text="Contacts"></TextBlock>
<Button Name="addContactButton" ToolTip="Add Contact"
Command="{Binding RaiseAddContactInteractionCommand}">
<Image Source="/PrismApp.Controls;component/Images/add.png"/>
</Button>
...
</ToolBar>
</DockPanel>
...
</Grid>
这是 AddContactPopupView:
<UserControl x:Class="PrismApp.Modules.Configuration.Contacts.Views.AddContactPopupView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d"
d:DesignHeight="700" d:DesignWidth="500">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<DockPanel Grid.Row="0">
<ToolBar Style="{StaticResource ModuleToolBarStyle}">
<TextBlock Margin="10,0,0,0" Text="Add contact"/>
<Button Name="addAndCloseButton" ToolTip="Add Contact" Command="{Binding ConfirmCommand}">
<Image Source="/PrismApp.Controls;component/Images/add.png"/>
</Button>
<Button Name="cancelButton" ToolTip="Cancel" Command="{Binding CancelCommand}">
<Image Source="/PrismApp.Controls;component/Images/cancel.png"/>
</Button>
</ToolBar>
</DockPanel>
<Grid Margin="0,0,7,0" Grid.Row="1">
...
<!-- User controls to fill the contact details -->
</Grid>
</Grid>
</UserControl>
这是 AddContactPopupViewModel:
public class AddContactPopupViewModel : BindableBase, IInteractionRequestAware
{
private ContactNotification notification;
public AddContactPopupViewModel()
{
this.ConfirmCommand = new DelegateCommand(this.AcceptContactConfiguration);
this.CancelCommand = new DelegateCommand(this.CancelInteraction);
}
public Action FinishInteraction { get; set; }
public INotification Notification
{
get
{
return this.notification;
}
set
{
if (value is ContactNotification)
{
this.notification = value as ContactNotification;
this.OnPropertyChanged(() => this.Notification);
}
}
}
public ICommand ConfirmCommand { get; private set; }
public ICommand CancelCommand { get; private set; }
public void AcceptContactConfiguration()
{
if (this.notification != null)
{
this.notification.Confirmed = true;
}
this.FinishInteraction();
}
public void CancelInteraction()
{
if (this.notification != null)
{
this.notification.Name = null;
this.notification.LastName = null;
this.notification.Telephone1 = null;
this.notification.Confirmed = false;
}
this.FinishInteraction();
}
}
这是 ContactNotification 自定义 class:
public class ContactNotification : Confirmation
{
public ContactNotification()
{
}
public string Name { get; set; }
public string LastName { get; set; }
public string Telephone1 { get; set; }
}
最后,这是 ContactsViewModel:
public class ContactsViewModel : BindableBase
{
private readonly IRegionManager regionManager;
private readonly IEventAggregator eventAggregator;
private readonly IConfigurationContactsService contactsService;
private readonly DelegateCommand<object> deleteContactCommand;
private ObservableCollection<Contact> contactsCollection;
private ICollectionView contactsView;
public ContactsViewModel(IEventAggregator eventAggregator, IConfigurationContactsService contactsService, IRegionManager regionManager)
{
this.regionManager = regionManager;
this.contactsService = contactsService;
this.eventAggregator = eventAggregator;
this.deleteContactCommand = new DelegateCommand<object>(this.DeleteContact, this.CanDeleteContact);
this.contactsCollection = new ObservableCollection<Contact>(contactsService.GetContacts());
this.contactsView = CollectionViewSource.GetDefaultView(this.contactsCollection);
this.ContactInteractionRequest = new InteractionRequest<ContactNotification>(); // Here is the InteractionRequest instantiated
this.RaiseAddContactInteractionCommand = new DelegateCommand(this.RaiseAddContactInteraction);
}
public ICollectionView ContactsView
{
get { return this.contactsView; }
}
public ObservableCollection<Contact> Contacts
{
get { return this.contactsCollection; }
}
public ICommand DeleteContactCommand
{
get { return this.deleteContactCommand; }
}
private void DeleteContact(object ignore)
{
IList<Contact> selectedContacts = contactsService.GetSelectedContacts();
foreach (Contact contact in selectedContacts)
{
if (contact != null)
{
contactsService.DeleteContact(contact);
Contacts.Remove(contact);
}
}
}
private bool CanDeleteContact(object ignored)
{
return true;
}
public InteractionRequest<ContactNotification> ContactInteractionRequest { get; private set; }
public ICommand RaiseAddContactInteractionCommand { get; private set; }
private void RaiseAddContactInteraction()
{
ContactNotification notification = new ContactNotification();
notification.Title = "New contact";
this.ContactInteractionRequest.Raise(notification,
returned =>
{
if (returned != null && returned.Confirmed)
{
var result = contactsService.AddContact(new Contact
{
Name = returned.Name,
LastName = returned.LastName,
Telephone1 = returned.Telephone1,
});
if (!result)
throw new NotImplementedException("TODO: Handle this");
SetProperty<ObservableCollection<Contact>>(ref this.contactsCollection, new ObservableCollection<Contact>(contactsService.GetContacts()), "Contacts");
}
else
{
// TODO
}
}); // After this, AddContactPopup should popup in a new window. But nothing happens
}
}
调用 ContactInteractionRequest.Raise 后,应该会弹出一个新的 window,但什么也没有发生。我正在努力寻找问题所在。有什么想看的地方吗?
Any ideas where to look at?
您必须清理您的参考资料。混合使用 Prism 5 和 Prism 6 效果不是很好,或者更确切地说,根本不起作用。
因此,从您的 packages.config
和项目引用中删除与 prism 相关的所有内容,然后从 nuget 添加 prism 6(我刚刚添加了 Prism.Unity
,它带来了所需的一切)。然后,您必须将 using
中的一些 using
和模块配置更正为 <section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
,弹出窗口会按预期显示。
我正在使用 Prism 实现一些交互性,以便在按下按钮后在弹出窗口中显示一个表单。但是弹窗没有显示。
这是我定义按钮的视图 (ContactsView):
<i:Interaction.Triggers>
<prism:InteractionRequestTrigger SourceObject="{Binding ContactInteractionRequest, Mode=OneWay}">
<prism:PopupWindowAction>
<prism:PopupWindowAction.WindowContent>
<views:AddContactPopupView />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
</i:Interaction.Triggers>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<DockPanel Grid.Row="0" Background="#D6D6DC">
<ToolBar Style="{StaticResource ModuleToolBarStyle}">
<TextBlock Margin="10,0,0,0" Text="Contacts"></TextBlock>
<Button Name="addContactButton" ToolTip="Add Contact"
Command="{Binding RaiseAddContactInteractionCommand}">
<Image Source="/PrismApp.Controls;component/Images/add.png"/>
</Button>
...
</ToolBar>
</DockPanel>
...
</Grid>
这是 AddContactPopupView:
<UserControl x:Class="PrismApp.Modules.Configuration.Contacts.Views.AddContactPopupView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d"
d:DesignHeight="700" d:DesignWidth="500">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<DockPanel Grid.Row="0">
<ToolBar Style="{StaticResource ModuleToolBarStyle}">
<TextBlock Margin="10,0,0,0" Text="Add contact"/>
<Button Name="addAndCloseButton" ToolTip="Add Contact" Command="{Binding ConfirmCommand}">
<Image Source="/PrismApp.Controls;component/Images/add.png"/>
</Button>
<Button Name="cancelButton" ToolTip="Cancel" Command="{Binding CancelCommand}">
<Image Source="/PrismApp.Controls;component/Images/cancel.png"/>
</Button>
</ToolBar>
</DockPanel>
<Grid Margin="0,0,7,0" Grid.Row="1">
...
<!-- User controls to fill the contact details -->
</Grid>
</Grid>
</UserControl>
这是 AddContactPopupViewModel:
public class AddContactPopupViewModel : BindableBase, IInteractionRequestAware
{
private ContactNotification notification;
public AddContactPopupViewModel()
{
this.ConfirmCommand = new DelegateCommand(this.AcceptContactConfiguration);
this.CancelCommand = new DelegateCommand(this.CancelInteraction);
}
public Action FinishInteraction { get; set; }
public INotification Notification
{
get
{
return this.notification;
}
set
{
if (value is ContactNotification)
{
this.notification = value as ContactNotification;
this.OnPropertyChanged(() => this.Notification);
}
}
}
public ICommand ConfirmCommand { get; private set; }
public ICommand CancelCommand { get; private set; }
public void AcceptContactConfiguration()
{
if (this.notification != null)
{
this.notification.Confirmed = true;
}
this.FinishInteraction();
}
public void CancelInteraction()
{
if (this.notification != null)
{
this.notification.Name = null;
this.notification.LastName = null;
this.notification.Telephone1 = null;
this.notification.Confirmed = false;
}
this.FinishInteraction();
}
}
这是 ContactNotification 自定义 class:
public class ContactNotification : Confirmation
{
public ContactNotification()
{
}
public string Name { get; set; }
public string LastName { get; set; }
public string Telephone1 { get; set; }
}
最后,这是 ContactsViewModel:
public class ContactsViewModel : BindableBase
{
private readonly IRegionManager regionManager;
private readonly IEventAggregator eventAggregator;
private readonly IConfigurationContactsService contactsService;
private readonly DelegateCommand<object> deleteContactCommand;
private ObservableCollection<Contact> contactsCollection;
private ICollectionView contactsView;
public ContactsViewModel(IEventAggregator eventAggregator, IConfigurationContactsService contactsService, IRegionManager regionManager)
{
this.regionManager = regionManager;
this.contactsService = contactsService;
this.eventAggregator = eventAggregator;
this.deleteContactCommand = new DelegateCommand<object>(this.DeleteContact, this.CanDeleteContact);
this.contactsCollection = new ObservableCollection<Contact>(contactsService.GetContacts());
this.contactsView = CollectionViewSource.GetDefaultView(this.contactsCollection);
this.ContactInteractionRequest = new InteractionRequest<ContactNotification>(); // Here is the InteractionRequest instantiated
this.RaiseAddContactInteractionCommand = new DelegateCommand(this.RaiseAddContactInteraction);
}
public ICollectionView ContactsView
{
get { return this.contactsView; }
}
public ObservableCollection<Contact> Contacts
{
get { return this.contactsCollection; }
}
public ICommand DeleteContactCommand
{
get { return this.deleteContactCommand; }
}
private void DeleteContact(object ignore)
{
IList<Contact> selectedContacts = contactsService.GetSelectedContacts();
foreach (Contact contact in selectedContacts)
{
if (contact != null)
{
contactsService.DeleteContact(contact);
Contacts.Remove(contact);
}
}
}
private bool CanDeleteContact(object ignored)
{
return true;
}
public InteractionRequest<ContactNotification> ContactInteractionRequest { get; private set; }
public ICommand RaiseAddContactInteractionCommand { get; private set; }
private void RaiseAddContactInteraction()
{
ContactNotification notification = new ContactNotification();
notification.Title = "New contact";
this.ContactInteractionRequest.Raise(notification,
returned =>
{
if (returned != null && returned.Confirmed)
{
var result = contactsService.AddContact(new Contact
{
Name = returned.Name,
LastName = returned.LastName,
Telephone1 = returned.Telephone1,
});
if (!result)
throw new NotImplementedException("TODO: Handle this");
SetProperty<ObservableCollection<Contact>>(ref this.contactsCollection, new ObservableCollection<Contact>(contactsService.GetContacts()), "Contacts");
}
else
{
// TODO
}
}); // After this, AddContactPopup should popup in a new window. But nothing happens
}
}
调用 ContactInteractionRequest.Raise 后,应该会弹出一个新的 window,但什么也没有发生。我正在努力寻找问题所在。有什么想看的地方吗?
Any ideas where to look at?
您必须清理您的参考资料。混合使用 Prism 5 和 Prism 6 效果不是很好,或者更确切地说,根本不起作用。
因此,从您的 packages.config
和项目引用中删除与 prism 相关的所有内容,然后从 nuget 添加 prism 6(我刚刚添加了 Prism.Unity
,它带来了所需的一切)。然后,您必须将 using
中的一些 using
和模块配置更正为 <section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
,弹出窗口会按预期显示。