0

我是 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 连接发生了变化?

4

1 回答 1

1

尝试将 ElementName Binding 替换为:

{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Mode=OneWay, Path=DataContext, UpdateSourceTrigger=PropertyChanged}'

ElementName 只能解析特定范围内的名称,并且在 DataTemplate 中使用它们来引用外部事物通常不是一个好主意(尽管它在某些情况下会起作用)。

于 2010-02-06T19:53:55.940 回答