WPF DataGrid:DataGridComboxBox ItemsSource绑定到集合集合

情况:

我在XAML中创建了一个DataGrid,并将ItemsSource绑定到包含属性的某个类的ObservableCollection。 然后在C#中,我创建了一个DataGridTextColumn和一个DataGridComboBoxColumn,并将这些绑定到ObservableCollection内对象的属性。 我可以将DataGridComboBoxColumn绑定到一个简单的Collection,但我想要做的是将它绑定到一组字符串集合,这样对于每一行,DataGrid中的ComboBox都有一个不同的字符串集合。 我没有这样做……

题:

如何绑定DataGridCombBoxColumn以便为此类列的每一行提供不同的字符串集合?

代码示例:

XAML:

  WPFToolkit:DataGrid x:Name="DG_Operations" Margin="10,5,10,5" Height="100" HorizontalAlignment="Stretch" FontWeight="Normal" ItemsSource="{Binding Path=OperationsStats}" AlternatingRowBackground="{DynamicResource SpecialColor}" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" SelectionMode="Extended" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="True" CanUserSortColumns="True" AutoGenerateColumns="False" IsReadOnly="False" IsEnabled="True" BorderThickness="1,1,1,1" VerticalAlignment="Stretch"/>   

C#:

 public class DataModelStatsOperations { public ObservableCollection OperationsStats { get; set; } } public interface IStatsOperation { string Operation { get; set; } Collection Data{ get; set; } } public class StatsOperation : IStatsOperation { public StatsOperation(string operation, Collection data) { Operation = operation; Data = data; } public string Operation { get; set; } public Collection Data{ get; set; } } private ObservableCollection dataOperations_ = new ObservableCollection(); //... Binding items = new Binding(); PropertyPath path = new PropertyPath("Operation"); items.Path = path; DG_Operations.Columns.Add(new DataGridTextColumn() { Header = "Operations", Width = 133, Binding = items }); DG_Operations.Columns.Add(new DataGridComboBoxColumn() { Header = "Data", Width = 190, ItemsSource = /*???*/, SelectedValueBinding = new Binding("Data"), TextBinding = new Binding("Data") }); dataOperations_.Add(new StatsOperation(CB_Operation.SelectedItem.ToString(), dataCollection)); DG_Operations.DataContext = new DataModelStatsOperations { OperationsStats = dataOperations_ }; //... 

任何帮助将不胜感激!

笔记:

好的,所以在看了两个第一个答案之后我注意到了一些东西。 我的绑定真的不对! 现在,我想要做的是类似于AndyG提出的建议:

 DG_Operations.Columns.Add(new DataGridComboBoxColumn() { Header = "Data", Width = 190, ItemsSource = new Binding("Data"), //notice this here does not work (have a look at the following error) SelectedValueBinding = new Binding("Operation"), TextBinding = new Binding("Operation") }); 

错误:“无法将类型’System.Windows.Data.Binding’隐式转换为’System.Collections.IEnumerable’。”

ItemsSource如何绑定到Data?

首先,这应该很容易……其次,为什么要在C#中构建(和绑定)列? 伊克。

XAML (我使用常规网格,因为我很懒):

                 

C#

 void Window1_Loaded(object sender, RoutedEventArgs e) { var dahList = new List(); dahList.Add(new StatsOperation { Operation = "Op A", Choices = new string[] { "One", "Two", "Three" }, }); dahList.Add(new StatsOperation { Operation = "Op B", Choices = new string[] { "4", "5", "6" }, }); this.MyListView.ItemsSource = dahList; } 

结果:

具有动态combobox选项的WPF网格http://www.singingeels.com/Articles/Articles/UserImage.aspx?ImageID=b1e3f880-c278-4d2b-bcc2-8ad390591200

我认为错误在于你是如何完成绑定的。 定义列时,绑定与特定行表示的对象相关。 据我所知,每行都有一个StatsOperation,因此TextBox列绑定到操作,这就是你拥有它的方式,ComboBox列ItemsSource应绑定到Collection。 现在它看起来像绑定了Collection>

我之前没有在代码隐藏中定义列,所以这里是XAML中的一个例子。 我发现ComboBoxColumn有时会很棘手所以我已经展示了如何使用TemplateColumn或ComboBoxColumn在列中添加combobox。 我从我自己的代码中复制粘贴,所以在你的情况下用’WPFToolkit’替换’dg’:

                     

我假设Operation是所选项,Data是要从中选择的项,并且DataGrid绑定到StatsOperation的集合。 祝好运!

要修复ItemsSource绑定错误,请使用以下格式:

 BindingOperations.SetBinding(new DataGridComboBoxColumn(), DataGridComboBoxColumn.ItemsSourceProperty, new Binding("Data")); 

您显然无法在初始化程序中执行此操作,因此您必须稍微移动声明,但这应该在更新中处理该错误。

编辑对不起,我在中午的时候有点慢:)。 这是一个更新的答案。 它看起来像Vincent Sibal WPF DataGrid的精彩文章- DataGridComboBoxColumn v1 Intro回答了你的问题。 可以?

部分 – 我认为你所说的有一个混乱。 您说您需要在每一行中收集字符串集合,以便combobox可以显示不同行的不同字符串。 但是,对于显示一组字符串的combobox,您只需要每行的字符串集合,而不是字符串集合的集合。

既然你需要每行的字符串集合,你可能会认为你需要收集字符串集合。

我对你的问题的理解是否正确? 如果是这样,那么你提到的字符串集合是错误的。

你真正需要的是StatOperations的集合,其中每个StatOperation都应该有一个字符串集合。 这正是您在上面的课程中所展示的。

为了取得进展,我建议你编辑你的问题,并指出在修复AndyG建议的绑定之后你到底陷入了什么。