WPF使用反射在对话框中显示用户控件

时间:2018-02-20 09:51:44

标签: c# wpf reflection prism

目前,我在Switch / Case中有以下代码。这段代码对我来说很好,但我正在寻找一个解决方案,我可以用反射来做到这一点。否则,我必须重复以下代码70次。

Equals!

1 个答案:

答案 0 :(得分:0)

据我所知,可以为他们自动解析Views和ViewModel(如果他们在UnityContainer中注册。

所以我想,你应该: 1)向每个视图添加此附加属性。

mvvm:ViewModelLocator.AutoWireViewModel="True"

默认情况下,PRISM可以解析ViewModel for View,但它们应该具有相同的名称ViewA和ViewAViewModel,并且位于相应的文件夹中(视图的视图和视图模型的ViewModel)

2)为了收集视图,我使用了属性,我已经应用于每个视图,我也用它在一些PrismRegions中注册视图。 (您可以删除此属性。我正在使用它们来创建基于视图的导航)

 [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class RegionRegistrationAttribute: Attribute 
{
    public RegionRegistrationAttribute()
    {

    }
    /// <summary>
    /// Name of region where view will be registred
    /// </summary>
    public String InjectionRegionName { get; set; }

    /// <summary>
    /// This is name of registartion in 
    /// </summary>
    public String RegistrationName { get; set; }
}

3)然后对视图应用此属性

 [RegionRegistration(InjectionRegionName = RegionNames.ContentRegion, RegistrationName = ViewNames.MainView )]
public partial class MainView : Window
{

//some code

}

4)由于我的解决方案中的视图由模块分隔,因此我应该收集并注册每个模块的视图。为此,我创建了一个简单的加载器,它从调用程序集中加载视图(在我的例子中是模块)(你可以使用Assembly.GetCallingAssembly();来获得正确的程序集)

        public void CollectAndRegisterViews()
    {
        Assembly assembly = Assembly.GetCallingAssembly();
        var viewNamespace = $"{assembly.GetName().Name}.{_defaultAssemblyFolder}";

        var types = from type in assembly.GetTypes().Where(x=>x.Namespace==viewNamespace)
                    where Attribute.IsDefined(type, typeof(RegionRegistrationAttribute))
                    select type;

        foreach (var type in types)
        {
            Debug.WriteLine($"\t>>Registering View by type{type.FullName}");

            var attribute = type.GetCustomAttributes<RegionRegistrationAttribute>().FirstOrDefault();

            _regionManager.RegisterViewWithRegion(attribute.InjectionRegionName, type);

           _container.RegisterType(typeof(object), type, attribute.RegistrationName);
        }
    }

5)然后,如果你在开关中做了所有事情,那么你就会这样:

  _container.Resolve<MainView>().Show() 

然后Prism将自动为您的MainView解析ViewModel。