在WPF中绑定动态属性:绑定到DynamicObject或Dictionary,或其他

本文关键字:绑定 DynamicObject 其他 Dictionary WPF 动态 属性 | 更新日期: 2023-09-27 17:51:01

我正在做一个WPF应用程序与数据库,实体框架4。

其中一个功能类似于TFS工作项提交。除了核心字段,用户还可以添加一些额外的字段并保存。主要问题是将额外的字段绑定到UI。只要一个UI与最少的功能是足够的:一些核心字段,和stackpanel或itemscontrol或类似的东西,可以显示额外的字段。

我现在主要有两个想法:

  1. 的动态对象,属性可以在运行时创建,但我我还不知道如何将它们绑定到UI(我需要你的解决方案)请)?
  2. 绑定一个字典到itemscontrol(但它是好的绑定风格吗?特别是当我想要一些MVVM风格,或者当我需要不同的数据模板不同的属性类型?)

因为我是一个编程新手,我甚至不知道上面哪一个最终会起作用。我只是想象和问问题,然后才最终尝试。你能建议一种最简单的方法吗?

在WPF中绑定动态属性:绑定到DynamicObject或Dictionary,或其他

在WPF中,我们使用数据元素,而不是UI元素。我的意思是,您的用户将添加与这些新属性相关的数据。您的工作是显示这些数据,甚至可能用于编辑目的。在这方面,它与其他观点没有什么不同。通常,我们通过声明DataTemplate s来显示数据。

在您的例子中,假设您有用户添加的string属性,它们可以存储在类似于这样的类中:

public class CustomData // Implement the INotifyPropertyChanged interface here
{
    public string Label { get; set; }
    public string Value { get; set; }
}

然后显示为可编辑的数据,你只需要定义正确的DataTemplate:

<DataTemplate x:Key="Template" DataType="{x:Type DataTypes:CustomData}">
    <Grid Grid.IsSharedSizeScope="True">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" SharedSizeGroup="Label" />
            <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" Text="{Binding Label}" />
        <TextBox Grid.Column="1" Text="{Binding Value}" />
    </Grid>
</DataTemplate>

DataTemplate将显示您的数据项及其LabelValue属性数据绑定到Grid中的控件。Grid.IsSharedSizeScopeSharedSizeGroup属性将确保所有控件排成一条漂亮的直线。

最后,将此类型的项集合绑定到ItemsControl.ItemsSource属性以显示它们:

<ListBox ItemsSource="{Binding YourCustomDataCollection}" />

你甚至可以StyleListBox,使它看起来不像ListBox,所以你的自定义数据控件只是看起来像一列正常的控件。