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" />,弹出窗口会按预期显示。