我正在使用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自定义类:
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后,会弹出一个新窗口,但没有任何反应。我正在努力寻找这个问题。任何想法在哪里看?
答案 0 :(得分:1)
任何想法在哪里看?
您必须清理参考文献。混合棱镜5和棱镜6不能很好地工作,或者说根本不起作用。
因此,删除与packages.config
和项目引用相关的所有棱镜,然后从nuget添加棱镜6(我刚刚添加了Prism.Unity
,它带来了所需的一切)。然后,您必须更正using
到app.config
中的某些<section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" />
和模块配置,弹出窗口会按预期显示。