在WPF中绑定动态属性:绑定到DynamicObject或Dictionary,或其他
本文关键字:绑定 DynamicObject 其他 Dictionary WPF 动态 属性 | 更新日期: 2023-09-27 17:51:01
我正在做一个WPF应用程序与数据库,实体框架4。
其中一个功能类似于TFS工作项提交。除了核心字段,用户还可以添加一些额外的字段并保存。主要问题是将额外的字段绑定到UI。只要一个UI与最少的功能是足够的:一些核心字段,和stackpanel或itemscontrol或类似的东西,可以显示额外的字段。我现在主要有两个想法:
- 的动态对象,属性可以在运行时创建,但我我还不知道如何将它们绑定到UI(我需要你的解决方案)请)?
- 绑定一个字典到itemscontrol(但它是好的绑定风格吗?特别是当我想要一些MVVM风格,或者当我需要不同的数据模板不同的属性类型?)
因为我是一个编程新手,我甚至不知道上面哪一个最终会起作用。我只是想象和问问题,然后才最终尝试。你能建议一种最简单的方法吗?
在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
将显示您的数据项及其Label
和Value
属性数据绑定到Grid
中的控件。Grid.IsSharedSizeScope
和SharedSizeGroup
属性将确保所有控件排成一条漂亮的直线。
最后,将此类型的项集合绑定到ItemsControl.ItemsSource
属性以显示它们:
<ListBox ItemsSource="{Binding YourCustomDataCollection}" />
你甚至可以Style
的ListBox
,使它看起来不像ListBox
,所以你的自定义数据控件只是看起来像一列正常的控件。