微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过 DataTemplate 向绑定到 WPF 应用程序中的 UI 的类添加动态属性特定于实例的动态属性

如何解决通过 DataTemplate 向绑定到 WPF 应用程序中的 UI 的类添加动态属性特定于实例的动态属性

我有一个 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>

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

enter image description here

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

物业名称:职业

属性类型:字符串

属性值:“老师”

然后,点击弹出窗口中的应用按钮,我们将得到:

enter image description here

请注意,它就像一个属性

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 实例的动态属性

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

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

解决方法

最终,我已经按照我在我的问题中提出的建议实施了它:

我已添加到人类:

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

然后在原始 DataTemplate 中使用了一个带有 itemTemplate 的附加 ItemsControl。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。