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