【问题标题】:c# prism regions in modal dialogsc# 模态对话框中的棱镜区域
【发布时间】:2018-06-08 15:14:40
【问题描述】:

我目前正在使用 C# WPF + PRISM 6.0 开发应用程序。现在我想将数据导入助手实现为模式对话框。这个对话框必须是可导航的,所以我在其中定义了一个区域,在用户单击“下一个”或“上一个”后将显示助手页面。

模式对话框将通过使用 IDialogService 来显示。

我的问题是,模态对话框区域未解决,因此我无法向其中添加助手视图。这是我正在尝试的

在我的模块中,我正在注册应用程序视图和视图模型并尝试将视图添加到区域

Container.RegisterType<IAppView, AppView>();
Container.RegisterType<IAppViewModel, AppViewModel>();

IViewModel viewModel = Container.Resolve<IViewModel>();
var region = RegionManager.Regions.FirstOrDefault(r => r.Name == "MainAppRegion");
if (region != null)
{
    region.Add(viewModel.View);
}

Container.RegisterType<IModalDialogView, ModalDialogView>();
Container.RegisterType<IModalDialogViewModel, ModalDialogViewModel>();

# here the region is null, and i can't add the ModalDialogView to it
IViewModel viewModel = Container.Resolve<IModalDialogViewModel>();
region = RegionManager.Regions.FirstOrDefault(r => r.Name == "ModalDialogCenterRegion");
if (region != null)
{
    region.Add(viewModel.View);
}

模态对话框是一个窗口,因为 IDialogService 需要一个窗口。

这是实现此类助手的正确方法吗?

感谢和问候,

迈克尔

【问题讨论】:

  • viewModel.View 到底应该做什么?此外,我认为您的区域未在区域管理器中注册,因为它位于弹出窗口中。看看这里:stackoverflow.com/questions/41212881/…
  • 我编辑了代码 sn-p。现在容器注册了我的视图和视图模型,就像在我的真实代码中一样。那是我身边的一种类型。我使用已解析的 viewModel.View 属性将视图添加到该区域。这是我从 Brian Lagunas 那里得到的一种模式
  • RegionManager.RequestNavigate 有什么问题?导航到视图或视图模型,prism 或 wpf 将创建另一个。
  • 当我使用 RegionManager.RequestNavigate 时,区域不会自动添加到 RegionManager 的区域中。当我尝试向该区域添加视图时,区域管理器无法解析该区域。我得到异常:此 RegionManager 不包含名为“ModalDialogCenterRegion”的区域
  • 这就是链接答案中所写的内容 - 如果托管区域的控件最初不是可视化树的一部分,则必须手动将区域添加到区域管理器中

标签: c# wpf prism


【解决方案1】:

这里是我的 IModalDialogView (ImportDialogView) 和 IModalDialogViewModel (ImportDialogViewModel) 的来源

下面的接口定义有点像建筑工地。我从两个接口(IModalDialogViewModel 和 IInteractionRequestAware)派生,因为我不确定我将使用哪种模式对话框模式或哪种模式更适合我的需要。到目前为止,从两者派生,并没有破坏功能。

IImportDialogViewModel.cs

using System.Collections.Generic;
using Infrastructure.Interfaces;
using Model;
using MvvmDialogs;
using Prism.Interactivity.InteractionRequest;
using Prism.Regions;

namespace Modules.Interfaces.ImportAssistant
{
    public interface IImportDialogViewModel : IViewModel, IModalDialogViewModel, IInteractionRequestAware
    {
        IEnumerable<Data> ImportedData { get; set; }
        IRegionManager RegionManager { get; set; }
    }
}

importdialogview.xaml

<UserControl x:Class="Modules.View.ImportAssistant.ImportDialogView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:inf="clr-namespace:Infrastructure;assembly=Infrastructure" xmlns:local="clr-namespace:Modules.View.ImportAssistant"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:md="https://github.com/fantasticfiasco/mvvm-dialogs"
             xmlns:prism="http://prismlibrary.com/" xmlns:ImportAssistant="clr-namespace:Modules.ViewModel.ImportAssistant"
             Width="1200" Height="600"
             mc:Ignorable="d" Loaded="ImportDialogView_OnLoaded"
             d:DataContext="{d:DesignInstance d:Type=ImportAssistant:ImportDialogViewModel}"
             md:DialogServiceViews.IsRegistered="True">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="80" />
            <RowDefinition Height="*" />
            <RowDefinition Height="40" />
        </Grid.RowDefinitions>
        <Label Grid.Row="0"
               Content="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
               FontSize="24"
               Style="{StaticResource TitleLabelStyle}" />
        <ContentControl x:Name="AssistantDialogContentControl" Grid.Row="1"
                        prism:RegionManager.RegionName="{x:Static inf:RegionNames.ImportAssistantMain}" />
        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <StackPanel Grid.Column="0" HorizontalAlignment="Left"
                        Orientation="Vertical">
                <Button Command="{Binding AbortAssistantCommand}"
                        Content="Abort"
                        Style="{StaticResource DefaultDialogButton}" />
            </StackPanel>
            <StackPanel Grid.Column="1" HorizontalAlignment="Right"
                        Orientation="Horizontal">
                <Button Command="{Binding PreviousCommand}"
                        Content="Previous"
                        Style="{StaticResource DefaultDialogButton}" />
                <Button Command="{Binding NextCommand}"
                        Content="Next"
                        Style="{StaticResource DefaultDialogButton}" />
                <Button Command="{Binding FinishCommand}"
                        Content="Finish"
                        Style="{StaticResource DefaultDialogButton}" />
            </StackPanel>
        </Grid>
    </Grid>
</UserControl>

导入dialogview.xaml.cs

using System.Windows;
using System.Windows.Controls;
using Infrastructure.Interfaces;
using Modules.Interfaces.ImportAssistant;
using Prism.Regions;
using Infrastructure;
using Microsoft.Practices.ServiceLocation;
using System.Linq;

namespace Modules.View.ImportAssistant
{
    /// <summary>
    /// Interaction logic for ImportDialogView.xaml
    /// </summary>
    public partial class ImportDialogView : UserControl, IImportDialogView
    {
        public ImportDialogView(IImportDialogViewModel viewModel)
        {
            InitializeComponent();

            ViewModel = viewModel;
            viewModel.View = this;

            var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();

            if (regionManager.Regions.Any(r => r.Name == RegionNames.ImportAssistantMain) == false)
            {
                RegionManager.SetRegionName(AssistantDialogContentControl, RegionNames.ImportAssistantMain);
                RegionManager.SetRegionManager(AssistantDialogContentControl, regionManager);
            }
        }

        public IViewModel ViewModel
        {
            get { return (IImportDialogViewModel)DataContext; }
            set { DataContext = value; }
        }

        private void ImportDialogView_OnLoaded(object sender, RoutedEventArgs e)
        {

        }
    }
}

importdialogviewmodel.cs

using Model;
using Modules.View.ImportAssistant;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Input;
using Infrastructure.Interfaces;
using Modules.Interfaces.ImportAssistant;
using Infrastructure;
using Prism.Interactivity.InteractionRequest;

namespace Modules.ViewModel.ImportAssistant
{
    public class ImportDialogViewModel : BindableBase, IImportDialogViewModel
    {
        public IRegionManager RegionManager { get; set; }

        private string _title;
        public string Title
        {
            get { return _title; }
            set
            {
                SetProperty(ref _title, value, nameof(Title));
            }
        }
        public IView View { get; set; }

        public IEnumerable<Data> ImportedData { get; set; }



        private INotification _notification;
        public INotification Notification
        {
            get { return _notification; }
            set
            {
                var confirmation = value as ImportConfirmation;
                if (confirmation != null)
                {
                    //SetProperty(ref _notification, value, nameof(Notification));
                    _notification = confirmation;
                    RaisePropertyChanged(nameof(Notification));
                }
            }
        }


        public Action FinishInteraction { get; set; }


        private bool? _dialogResult;
        public bool? DialogResult
        {
            get { return _dialogResult; }
            set
            {
                if (_dialogResult != value)
                {
                    SetProperty(ref _dialogResult, value, nameof(DialogResult));
                }
            }
        }


        public ICommand AbortAssistantCommand { get; set; }
        public ICommand NextCommand { get; set; }
        public ICommand PreviousCommand { get; set; }
        public ICommand FinishCommand { get; set; }

        public ImportDialogViewModel(IImportDialogView view, IRegionManager r)
        {
            RegionManager = r;

            View = view;
            View.ViewModel = this;

            InitializeCommands();
        }

        private void InitializeCommands()
        {
            AbortAssistantCommand = new DelegateCommand(() => { DialogResult = false; });

            NextCommand = new DelegateCommand(() =>
            {
                var importDialogMainRegion = RegionManager.Regions.FirstOrDefault(r => r.Name == RegionNames.ImportAssistantMain);
                if (importDialogMainRegion != null)
                {
                    var firstActiveView = importDialogMainRegion.ActiveViews.FirstOrDefault();
                    string viewType = null;
                    if (firstActiveView is IImportStartView)
                    {
                        viewType = typeof(FileSelectionView).FullName;
                    }
                    else if (firstActiveView is FileSelectionView)
                    {
                        viewType = typeof(DataSelectionView).FullName;
                    }


                    if (string.IsNullOrEmpty(viewType) == false)
                    {
                        RegionManager?.RequestNavigate(RegionNames.ImportAssistantMain, viewType); 
                    }
                }
            });

            PreviousCommand = new DelegateCommand(() =>
            {
                var importDialogMainRegion = RegionManager.Regions.FirstOrDefault(r => r.Name == RegionNames.ImportAssistantMain);
                if (importDialogMainRegion != null)
                {
                    var firstActiveView = importDialogMainRegion.ActiveViews.FirstOrDefault();

                }
            });

            FinishCommand = new DelegateCommand(() => 
            {
                DialogResult = true;
                FinishInteraction?.Invoke();
            });
        }


    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多