代码之家  ›  专栏  ›  技术社区  ›  Lei Yang

在WPF中绑定动态财产:绑定到DynamicObject或Dictionary,还是其他?

  •  0
  • Lei Yang  · 技术社区  · 11 年前

    我正在开发一个带有数据库的WPF应用程序,即实体框架4。

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

    我目前有两个主要想法:

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

    由于我是一个编程新手,我甚至不知道以上哪一项最终会奏效。我只是在想象并提出问题,然后才最终尝试它们。你能提出一个最简单的方法吗?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Sheridan    11 年前

    在WPF中,我们与 数据元素 而不是 UI元素 。我的意思是,您的用户将添加 数据 这与这些新的财产有关。您的工作是显示这些数据,甚至可能用于编辑目的。在这方面,它与任何其他观点都没有区别。通常,我们通过声明 DataTemplate s

    在你的情况下,假设你 string 用户添加的财产可以存储在类似于以下内容的类中:

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

    然后,要将其显示为可编辑数据,只需定义正确的 数据模板 :

    <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>
    

    数据模板 将显示您的数据项及其 Label Value 中绑定到控件的财产数据 Grid 这个 Grid.IsSharedSizeScope SharedSizeGroup 财产将确保所有控件以一条漂亮的直线排列在一起。

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

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

    你甚至可以 Style 这个 ListBox 所以它看起来不像 列表框 ,这样您的自定义数据控件看起来就像一列普通控件。