当前,我在开关/情况中有以下代码。该代码对我来说很好,但是我正在寻找一个解决方法,以便如何使用反射进行此操作。否则,我必须重复以下代码70次。
var popupViewModel = new NetworkNameDescriptorViewModel(_eventAggregator)
{
DescriptorContext = new DescriptorModel {
Hex = obj.Hex,
Tag = obj.Tag,
Length = obj.Length,
Name = obj.Name
}
};
var popupView =_container.Resolve<NetworkNameDescriptor.NetworkNameDescriptor>();
popupView.DataContext = popupViewModel;
Window window = new Window()
{
Title = "Network name descriptor",
Content = popupView
};
window.Show();
据我所知,可以自动解决视图和视图模型(如果它们在UnityContainer中注册。
所以我想,您应该:1(将每个随附的属性添加到每个视图中。
mvvm:ViewModelLocator.AutoWireViewModel="True"
默认情况下,Prism可以解决视图的ViewModel,但是它们应该具有相同的名称Viewa和ViewAviewModel,并且位于适当的文件夹(视图的视图,以及视图模型的ViewModels(
2(用于收集我使用的属性的视图,该属性已应用于每个视图,也使用了它在某些棱镜中注册视图。(您可以删除此属性。我正在使用它们来创建基于视图的导航(
[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(,然后,如果您在开关中做了所有操作,则会有这样的smth:
_container.Resolve<MainView>().Show()
,然后棱镜将自动查看您的主视点。