0

我有一个 WPF 应用程序。我有一个 Person 类,如下所示:

 public class Person
{
    public Person(string id, string name, int age)
    {
        Id = id;
        Name = name;
        Age = age;
    }

    public string Id { set; get; }

    public string Name { set; get; }

    public int Age { set; get; }


}

在我的视图模型中,我有一个

public ObservableCollection<Person> People { get; set; }

我的视图如下所示:

    <Grid>
    <ItemsControl x:Name="DynamicPeople" ItemsSource="{Binding Path=People}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Background="Gray" Margin="6">
                    <StackPanel Orientation="Horizontal">
                        <Label Content="Id"/>
                        <Label Content="{Binding Path=Id}"/>
                    </StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <Label Content="Name"/>
                        <Label Content="{Binding Path=Name}"/>
                    </StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <Label Content="Age"/>
                        <Label Content="{Binding Path=Age}"/>
                    </StackPanel>
                    <Button Width="120" Height="60">Add New Property</Button>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

运行应用程序时,我们得到:

在此处输入图像描述

现在,要求是单击“添加新属性”按钮后,将打开一个弹出窗口,用户将在其中填写属性名称、属性类型和属性值。一旦用户在弹出窗口中单击“应用”,我们将返回显示的视图,并且应将新属性添加到数据模板中。例如,如果用户在弹出窗口中填写了 Adam:

物业名称:职业

属性类型:字符串

属性值:“老师”

然后,单击弹出窗口中的“应用”按钮,我们将获得:

在此处输入图像描述

请注意,它类似于以下属性:

public string Occupation { get; set; }

被添加到 Person 类中,但仅添加到 Adam 的第一个实例中。

我有一些想法,但是实现这样的事情的最佳方法是什么?

我考虑声明一个名为 DynamicProperty 的模型类:

    public class DynamicProperty
{
    public string Name { set; get; }

    public Type Type { set; get; }

    public object Value  { set; get; }
}

然后,我将添加到 person 类:

public ObservableCollection<DynamicProperty> DynamicProperties { get; set; }

这将代表我提到的特定于类 person 实例的动态属性。

然后我不确定如何编辑数据模板以与现有属性类似的方式显示新添加的属性(如姓名和年龄)。

我不喜欢我的方法,也许你有更好的想法?谢谢!

4

1 回答 1

0

最终,我实现了它类似于我在我的问题中提出的建议:

我已添加到人员类:

public ObservableCollection<DynamicProperty> DynamicProperties { get; set; }

然后在原始 DataTemplate 中使用了一个额外的 ItemsControl 和 itemTemplate。

于 2021-05-23T04:54:19.763 回答