【发布时间】:2021-11-14 20:11:57
【问题描述】:
我正在开发一个 MVVM WPF DataGrid 应用程序。我有一个 DataGrid 和一个多选 CheckBox 下拉菜单。每当我在菜单中选择一个选项时,我都想在 DataGrid 中添加一列。有什么办法吗?
ComboBox 项目模板背后的代码如下所示:
<ComboBox.ItemTemplate>
<DataTemplate>
<CheckBox
VerticalAlignment="Center"
ClickMode="Press"
Content="{Binding Position}"
IsChecked="{Binding IsSelected}" />
</DataTemplate>
</ComboBox.ItemTemplate>
【问题讨论】:
-
您可以使用 DataTable 作为数据源并对其进行操作。
-
你似乎有一些严重错误的看法。首先,DataTable 是一个简单的类,它实现了一个普通的表数据结构——它以行和列的形式构造数据。它是数据的容器。数据用于模型(持久化,应用业务逻辑),视图模型(从模型中获取数据,应用转换逻辑,充当视图的数据源,通过数据绑定交换数据)和视图(呈现数据,应用表示逻辑,例如将数据包装/映射到 UI 容器)。数据无处不在。
-
DataTable 可以在任何地方使用,就像您也可以在任何地方使用其他数据结构(如集合)一样。 ObservableCollection 和 DataTable 一样是一种数据结构。您可以将 DataTable 类型的属性作为绑定源公开给视图。 DataGrid.ItemsSource 可以同时处理:IEnumerable 和 DataTable,或者更准确地说是 ICollectionView 和 DataView。我可以向您保证,将 DataTable 作为绑定源是完全可以的。没有限制属性必须是什么类型才能成为有效的绑定源。您甚至可以绑定到 XML 数据。
-
如果将数据存储在 Model 中的 DataTable 结构中没有意义,则使用 View Model 将 Model 数据对象转换为 DataTable。然后将您的 DataGrid 直接绑定到此表。这是非常干净的 MVVM。
-
不客气。很高兴能帮到你。