我有一个包含几个视图类(XAML文件)的文件夹。 现在我通过代码实例化这些:
engineRoomView = new EngineRoomView()
{
DataContext = new ProcessViewModel()
};
然后再往下走:
item = new TabItem();
item.Contents = engineRoomView;
item.Name = "Engine Room";
views.Add(item);
我想要实现的是某种动态代码,用于在编程期间创建该特定文件夹中每个视图的一个实例而不知道它们。
如果开发人员将另一个xaml文件添加到该文件夹。然后在运行时创建它。
像虚构的东西:
Foreach(file in folder)
{
magicInstance = createInstanceFromFile(file);
MainViewModel.addView(magicInstance);
}
这可能吗?
答案 0 :(得分:0)
如果我理解正确,可以使用Xaml Reader中的内置版本存档。 Xaml Reader可以读取xaml文件,并根据xaml生成对象。
看看这里: Loading XAML at runtime?
答案 1 :(得分:0)
听起来您有一个“父视图”,您希望自动为同一文件夹中的每个文件附加子视图。
如果每个文件夹中的类具有与文件夹结构一致的命名空间,则此代码应该允许您在与从基类继承的示例实例相同的文件夹中创建每个类的实例列表(可以修改很容易接口)。
static class NamespaceHelper
{
public static List<Type> FindTypesInSameNamespaceAs(object instance)
{
string ns = instance.GetType().Namespace;
Type instanceType = instance.GetType();
List<Type> results = instance.GetType().Assembly.GetTypes().Where(tt => tt.Namespace == ns &&
tt != instanceType).ToList();
return results;
}
public static List<T> InstantiateTypesInSameNamespaceAs<T>(object instance)
{
List<T> instances = new List<T>();
foreach (Type t in FindTypesInSameNamespaceAs(instance))
{
if (t.IsSubclassOf(typeof(T)))
{
T i =(T) Activator.CreateInstance(t);
instances.Add(i);
}
}
return instances;
}
}
只需致电NamespaceHelper.InstantiateTypesInSameNamespaceAs<YourBaseViewType>(instanceOfParentViewInSameFolder)
,循环浏览结果,然后将其添加到您的家长。
Foreach(ViewBase v in NamespaceHelper.InstantiateTypesInSameNamespaceAs<ViewBase>(this))
{
MainViewModel.addView(v);
}