WPF从视图类获取RegionName

时间:2018-10-16 12:53:27

标签: c# wpf reflection prism region-management

使用Prism的WPF应用程序。

我正在使用多阶段模块初始化程序,并且在模块初始化过程中,我希望模块自检视图并注册其中定义的任何区域。

我正在使用类似于下面的代码的自检视图模型类并注册其他东西,但是我不知道如何反映到视图中。

protected void SelfInspectRegions()
{
    var assm = Assembly.GetAssembly(this.GetType()).GetTypes();
    foreach (var type in assm)
    {
        if(type.IsSubclassOf(typeof(UserControl)))
        {
            var a = type;
        }
    }
}

我要自行注册的基于Tab的区域(在View / UserControl上定义)的示例如下;

                <controls:ChTabControlModelAware x:Name="OrderProcessingDocumentDetailRegion"  
                                                           cal:RegionManager.RegionManager="{Binding RegionManager, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type shells:FormShell}}}"
                                                           cal:RegionManager.RegionName="Order Processing:DocumentDetailRegion"
                                                           cal:RegionManager.RegionContext="{Binding DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
                                                           Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="1" VerticalAlignment="Stretch"
                                                           HorizontalAlignment="Stretch">

                    <bindings:EventToCommandBehavior.EventBindings>
                        <bindings:EventBinding Command="{Binding SelectedDetailTabChangedCommand}"
                                  CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=controls:TabControl}, Path= SelectedItem.DataContext.HeaderInfo}"
                                  EventName="SelectionChanged" RaiseOnHandledEvents="True"
                                  PassEventArgsToCommand="True" />
                    </bindings:EventToCommandBehavior.EventBindings>
                </controls:ChTabControlModelAware>

主要我想提取该行中定义的RegionName;

cal:RegionManager.RegionName="Order Processing:DocumentDetailRegion"

我不确定该怎么做,将不胜感激地收到任何帮助

非常感谢

兰斯

更新17/10/2018:我要实现的目标。

我正在编写一个WPF应用程序框架,其中包含大约30个模块(并且正在扩展),所有模块都可以订阅和注入服务。

我的所有区域都在视图中声明,并且有很多负载。由于我的框架中不断发展的要求,现在模块有必要在模块初始化阶段预先注册其区域。原因之一是某些服务以特定区域为目标,并且每个主机的操作设置都是唯一的。当前,主机模块负责设置,这意味着如果对服务的操作设置进行更改,则会在模块和项目之间进行大量剪切和粘贴。通过主机的预注册,在模块初始化中,服务模块可以知道哪些模块在使用其服务,并且可以将设置类注入到主机模块设置viewModel中,以进行用户交互。只需在服务模块中修改对操作设置的更改,而无需在使用该服务模块的所有各种主机模块中进行修改。

我一直在寻找一种简便的方法来将名称从众多模块程序集中刮除,而不必显式声明它们或用声明性属性修饰视图模型。

1 个答案:

答案 0 :(得分:0)

我想获得实际区域名称的最简单方法是在完成向区域管理器的注册后拦截它们。

您应该注册自己的IRegionManager实现,该实现将所有内容转发到真实事物,但是将在注册过程中通过它的所有区域名称传递到您的区域名称注册表。