问题:无法绑定DataGridComboBoxColumn的ItemsSource属性

13

我有3张表:

Item - 它是DataContext - 它有一个导航列Group

Group - 有一个导航列Category。

我希望在DataGrid中同时显示(Category 和 Group)两列,并且当我选择一个Category时,它只应该在group列中显示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属性无法设置为非静态绑定?我怀疑是这样,因为即使我使用DummyConverter将ItemsSource设置为{Binding},它也不会停留在转换器中;而在类别ComboBox中,它却可以正常工作。

2个回答

32

数据网格中的列没有数据上下文,因为它们从未添加到可视树中。听起来有些奇怪,但是请查看Vince的博客,其中有一个良好的可视布局示例。一旦绘制了网格,单元格就有了数据上下文,您可以使用普通绑定(而不是静态资源)在其中设置组合框项目源。

您可以通过以下方式访问组合框项目源:

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

可以在这里这里查看一些代码。同时,您还需要像此贴子中所述为非编辑元素设置项源


如何使其在.NET 4.0数据网格中工作?Vince的博客似乎已经过时了。 - newman
我认为在.NET 4版本中,datagrid的ComboColumn实现并没有改变。 - Aran Mulholland
我使用了相同的方法,但数据源似乎无法绑定到列。在DataGrid中,我看到了一个空的ComboBox。 - Nps
在上面加一个debugConverter,看看绑定是否会触发(http://wpftutorial.net/DebugDataBinding.html) - Aran Mulholland
难道只针对具有DataContext的特定ElementName进行目标定位也可以工作吗? - William
我知道这已经有一段时间了,但对我来说使用 {Binding MyBindingPath} 而不是 {Binding Path=MyBindingPath} 是可行的。 - Luke Vanzweden

8
我正在使用MVVM,希望将列的ItemSource绑定到窗口数据上下文中的对象集合。 我尝试了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>

我认为这个决定比使用代理元素更简单...谢谢! - vladimir khozeyev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接