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



当前,我在开关/情况中有以下代码。该代码对我来说很好,但是我正在寻找一个解决方法,以便如何使用反射进行此操作。否则,我必须重复以下代码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() 

,然后棱镜将自动查看您的主视点。

最新更新