为类创建动态视图

时间:2018-08-23 20:27:03

标签: c# wpf mvvm

好的,我已经问了一个先前的问题,但是我认为我需要退后一步,问一个不同的问题。

我在这里要做的是为从游戏(改装工具)解码的字段创建一个编辑器,这些文件由第3方库解码并添加到传递回的类中。

现在,该类有1000多个变体,它们都共享基类NMSTemplate,每个变体都有自己的独特属性,可以是基本对象(字符串,整数)到{的其他变体的集合{1}}。

我已经尝试了多种方法来完成此操作,而最新的操作如下所示

NMSTemplate

然后我将列表视图绑定到此字段集合,并使用数据模板更改其显示方式

IOrderedEnumerable<FieldInfo> fields = template.GetType().GetFields().OrderBy(field => field.MetadataToken);

        foreach(FieldInfo f in fields)
        {
            MBINField field = new MBINField()
            {
                Name = f.Name,
                Value = f.GetValue(null),
                NMSType = f.FieldType.Name
            };
            _fields.Add(field);
        }

现在,由于来自FieldInfo的价值问题引起了人们的关注,我意识到当我遇到<DataTemplate x:Key="MbinListTemplate"> <StackPanel Orientation="Vertical"> <TextBlock Text="{Binding Name}"/> <ListView ItemsSource="{Binding Value}" ItemTemplateSelector="{StaticResource MbinTemplateSelector}" /> </StackPanel> </DataTemplate> <DataTemplate x:Key="MbinStringTemplate"> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Name}" /> <TextBox Text="{Binding Value}" /> </StackPanel> </DataTemplate> 集合的Property时遇到了一个陷阱,我不确定接下来该如何处理动态显示该集合中类的属性。

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确回答了您的问题,但是您可以尝试检查字段类型并分别处理每种类型。这是处理类型List<NMSTemplate>

的字段的示例
var fields = template.GetType().GetFields().OrderBy(field => field.MetadataToken);
foreach(var f in fields)
{
    var isGeneric = f.FieldType.IsGenericType;
    var isList = f.FieldType == typeof(List<NMSTemplate>);

    if(isGeneric && isList)
    {                        
        var value = f.GetValue(template);
        var list = (List<NMSTemplate>)value;

        foreach(var listEntry in list)
        {
            // ...
        }
    }
}

在foreach循环中,您可以创建所有MBINField对象并将它们添加到_fields列表中。