【问题标题】:Binding WPF Toolkit DataGrid ComboBox column to Linq-to-Sql collection after Window loads and connection changes?Window 加载和连接更改后,将 WPF Toolkit DataGrid ComboBox 列绑定到 Linq-to-Sql 集合?
【发布时间】:2010-02-04 21:23:51
【问题描述】:

我是 MVVM 的初学者。主窗口使用 WPF Toolkit 中的常用 DataGrid。它有一个视图模型并且仅依赖于 .xaml.cs 文件中的 DataContext_Changed 事件处理程序。主窗口的 DataContext 是 View Model。

我正在尝试将 DataGridComboBoxColumn 的 ItemsSource 属性绑定到视图模型上的 CLR 属性“FieldTypes”。 “FieldTypes”是一个从 FieldType 类型的 Linq to Sql 表派生的列表。 DataGrid 的 ItemsSource 来自一个 System.Data.Linq.Table,“FieldTypes”来自一个单独的表,这两个表没有关系

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

【问题讨论】:

    标签: wpf mvvm binding wpfdatagrid


    【解决方案1】:

    尝试用这个替换 ElementName 绑定:

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

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

    【讨论】:

    • 那行得通。我还没有意识到 ElementName。我还查看了 southridge 示例 (blogs.msdn.com/jaimer/archive/2009/02/10/…),它在 Grid.Resources 中使用了一个名为“spy”的 StaticResource,似乎可以正常工作。
    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多