我已经访问了很多关于它的主题,但我仍然无法找到问题的解决方案,我无法重复使用我发现的内容。
我创建了一个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(性能提升)。
感谢您的帮助,如果我错过了一些明显的事情,那就很抱歉。
答案 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个引用),但我当然错过了让它变得更轻的东西。
希望对别人有所帮助!