将DataGridComboBoxColumn绑定到WPF中的DataSet

时间:2014-06-12 10:15:58

标签: wpf dataset datagridcomboboxcolumn

我已经访问了很多关于它的主题,但我仍然无法找到问题的解决方案,我无法重复使用我发现的内容。

我创建了一个DataSet,它由2个表上的SQL查询填充。他们都有一个共同的领域,但没有外键(不要问我,我不能改变它):

SELECT table1.reference, table2.reference, table1.category...
FROM table1, table2
WHERE table1.reference = table2.reference
...
dataAdapter.Fill(dataSetGrid, "table1");

我的DataContext是正确的,我的DataSet用正确的值填充(我检查过),我将DataGrid的ItemsSource设置为:

this.grid1.ItemsSource = dataSetGrid.Tables[0].DefaultView;

然后我尝试了很多东西,但我能得到的最好的是我的ComboBox中的第一个元素,但每行有一个字母。

我在Xaml代码中的一个测试:

<DataGridComboBoxColumn Header="Caméras"
                        x:Name="Cameras"
                        ItemsSource="{Binding article}"
                        SelectedValuePath="reference"
                        DisplayMemberPath="reference"
                        Width="*"/>

这个给了我一个空的comboBox,但我在DataGridTextColumn中没问题。

它适用于类的ObservableCollection,但我希望我现在可以使用dataSet(性能提升)。

感谢您的帮助,如果我错过了一些明显的事情,那就很抱歉。

1 个答案:

答案 0 :(得分:1)

两天后,我对着那些非常奇怪的控件砸了我的头,我终于找到了解决方案。实际上我找到了一些可以很好地解决我的问题的代码,我只需要正确的上下文。我确信我没有完全理解绑定是如何与组合框一起工作的,但这是我的解决方案:

代码背后:

Data data = new Data();
this.DataContext = data;
this.gridCameras.ItemsSource = data.dataSetCameras.Tables[0].DefaultView;

Xaml:

<DataGridTemplateColumn Header="Cameras">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding reference}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.dataSetCameras.Tables[0].DefaultView}"
                      SelectedItem="{Binding article}"
                      SelectedValue="reference"
                      DisplayMemberPath="reference"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

其中'reference'是DataSet表中字段的名称,'article'是我想要绑定的表的名称。

我仍然不知道为什么它与'AncestorType = {x:Type Window}'一起使用,因为我在userControl中,我从来不知道何时应该使用“something”而不是“{Binding something}”在属性中,或者“Path =”和“{Binding}”之间的真正区别是什么,但我认为“DataContext.dataSet”允许我得到一个结果,因为只有“dataSet”似乎不起作用。

无论如何,我做了一些测试,在我的情况下使用DataSet比使用Class的ObservableCollection要快得多(超过400个引用),但我当然错过了让它变得更轻的东西。

希望对别人有所帮助!