我是 MVVM 的初学者。主窗口使用 WPF Toolkit 中的常用 DataGrid。它有一个视图模型并且仅依赖于 .xaml.cs 文件中的 DataContext_Changed 事件处理程序。主窗口的 DataContext 是 View Model。
我正在尝试将 DataGridComboBoxColumn 的 ItemsSource 属性绑定到视图模型上的 CLR 属性“FieldTypes”。“FieldTypes”是一个 List,它派生自 FieldType 类型的 Linq to Sql 表。DataGrid的ItemsSource来自一个System.Data.Linq.Table,“FieldTypes”来自一个单独的Table,这两个表没有关系。
要将 FieldTypes DataGridComboBoxColumn 绑定到视图模型上的“FieldTypes”属性,我创建了一个 DataTemplate StaticResource 以在 DataGridTemplateColumn 中使用:
<DataTemplate x:Key='FieldTypeCombo' >
<ComboBox DataContext='{Binding ElementName=window, Mode=OneWay, Path=DataContext, UpdateSourceTrigger=PropertyChanged}'
ItemsSource='{Binding FieldTypes}'
DisplayMemberPath='Name'
/>
</DataTemplate>
事实证明,此 DataTemplate将适用于不在 DataGrid 中的主窗口的子元素,例如在 HeaderedContentControl.ContentTemplate 中,但在 DataGridTemplateColumn.CellTemplate 中不起作用。
如果我尝试将 DataGridComboBoxColumn 绑定到不在 DataGrid 中的常规 ComboBox 的 ComboBox.ItemsSource 属性,
<c:DataGridComboBoxColumn Header="FieldType"
ItemsSource="{Binding ElementName=regularcombobox, Path=ItemsSource, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
/>
它按预期工作,但不适用于 DataGrid 内的 ComboBox。
我希望在 View Model 的属性上拥有尽可能多的数据绑定,但这看起来也像是一个 StaticResource 的机会。然而,这个 StaticResource 会在窗口加载后发生变化,因为连接字符串直到之后才知道。即使将 ComboBox 列的 ItemsSource 绑定到 StaticResource,我也没有运气,或者 DynamicResource。
是否有某种方法可以使用 MVVM 将 DataGrid ComboBox 列绑定到与 DataGrid 的 ItemsSource 分开的集合?或者有没有办法用一个静态资源来完成这个,即使在窗口加载后 SQL 连接发生了变化?