绑定DataGridComboBoxColumn.ItemsSource的问题

时间:2009-11-12 17:59:02

标签: wpf binding wpftoolkit datagridcomboboxcolumn

我有3张桌子: Item - 这是DataContext - 它有一个导航列Group 组 - 具有导航列类别。

我希望在DataGrid中有两个(Category& Group)列,当我选择一个类别时,它应该只显示在group col中的Category.Groups。

以下是我正在处理的代码:

<tk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}">
    <tk:DataGrid.Columns>

        <!--Works-->
        <tk:DataGridComboBoxColumn                                        
            Header="Categroy" 
            DisplayMemberPath="Title"                    
            SelectedValuePath="CategoryId"
            SelectedValueBinding="{Binding Group.Category.CategoryId}"
            ItemsSource="{Binding Context.Categories, 
                Source={x:Static Application.Current}}"
        />


        <!--Look at these two things:-->

        <!--This does work-->
        <tk:DataGridTemplateColumn>
            <tk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ItemsControl
                        ItemsSource="{Binding Group.Category.Groups}">
                        <ItemsControl.ItemTemplate>
                            <DataTemplate DataType="{x:Type data:Group}">
                                <TextBlock Text="{Binding Title}"/>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </DataTemplate>
            </tk:DataGridTemplateColumn.CellTemplate>
        </tk:DataGridTemplateColumn>

        <!--But this does NOT work, even it's the same source-->
        <!--Notice I even tried a dummy converter and doesnt reach there-->
        <tk:DataGridComboBoxColumn 
            Header="Group" 
            DisplayMemberPath="Title"
            SelectedValuePath="GroupId"
            ItemsSource="{Binding Group.Category.Groups,
                Converter={StaticResource DummyConverter}}"
            SelectedValueBinding="{Binding Group.GroupId}"
            />

    </tk:DataGrid.Columns>
</tk:DataGrid>

更新
你会说问题是ItemsSource属性不能设置为非静态绑定吗? 我怀疑是因为即使我使用{Binding}将ItemsSource设置为DummyConverter,它也不会在转换器中停止;并且在类别ComboBox中它工作正常。

2 个答案:

答案 0 :(得分:28)

数据网格中的列没有datacontext,因为它们从未添加到可视树中。听起来有点奇怪,但看看vince's blog,它有一个很好的视觉布局的例子。绘制网格后,单元格具有数据上下文,您可以使用常规绑定(而非静态资源)在其中设置组合框项目源。

您可以访问组合框项目源:

<dg:DataGridComboBoxColumn>
   <dg:DataGridComboBoxColumn.EditingElementStyle>
      <Style TargetType="ComboBox">
         <Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" />
      </Style>
   </dg:DataGridComboBoxColumn.EditingElementStyle>
</dg:DataGridComboBoxColumn>

查看一些代码herehere。您还需要设置非编辑元素的项目来源,如此post

答案 1 :(得分:2)

我正在使用MVVM,我想将列的ItemSource绑定到窗口数据上下文中的对象集合。在找到this answer之前,我必须尝试过10种不同的方法并且没有效果

诀窍是在网格外定义CollectionViewSource,然后使用StaticResource在网格内引用它。例如,

<Window.Resources>
    <CollectionViewSource x:Key="ItemsCVS" Source="{Binding MyItems}" />
</Window.Resources>
<!-- ... -->
<DataGrid ItemsSource="{Binding MyRecords}">
    <DataGridComboBoxColumn Header="Column With Predefined Values"
                            ItemsSource="{Binding Source={StaticResource ItemsCVS}}"
                            SelectedValueBinding="{Binding MyItemId}"
                            SelectedValuePath="Id"
                            DisplayMemberPath="StatusCode" />
</DataGrid>