【问题标题】:Problem binding DataGridComboBoxColumn.ItemsSource问题绑定 DataGridComboBoxColumn.ItemsSource
【发布时间】:2010-12-16 00:02:06
【问题描述】:

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

我希望在 DataGrid 中有两个(类别和组)列,当我选择一个类别时,它应该只在组列中显示 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},它也不会在转换器中停止;并且在 Category ComboBox 中它工作正常。

【问题讨论】:

    标签: wpf binding wpftoolkit datagridcomboboxcolumn


    【解决方案1】:

    数据网格中的列没有数据上下文,因为它们从未添加到可视化树中。听起来有点奇怪,但看看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

    【讨论】:

    • 如何使其适用于 .NET 4.0 Datagrid? Vince 的博客似乎已经过时了。
    • 我不认为 .net 4 版本中数据网格的 ComboColumn 实现发生了变化
    • 我使用了相同的方法,但数据源似乎没有绑定列。我在 DataGrid 中看到空的组合框
    • 在其上安装一个 debugConverter 并查看绑定是否触发 (wpftutorial.net/DebugDataBinding.html)
    • 不应该只针对具有 DataContext 的特定 ElementName 工作吗?
    【解决方案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>
    

    【讨论】:

    • 我认为这个决定比使用代理元素更简单...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2016-03-19
    • 2011-11-03
    相关资源
    最近更新 更多