如何将DataTable绑定到DataGridComboBoxColumn

时间:2012-12-29 22:30:43

标签: wpf mvvm datagridcomboboxcolumn

我在DataGrid中有一个和DataGridComboBoxColumn的WPF窗口。我正在将DataContext分配给Window,如下所示:

cls = new MyClass
            {
                selValue = 2,
                DataGrid = dtGrid,
                ComboGrid = dtCombo
            };


            this.DataContext = cls;

以下是DataGridComboBoxColumn的XAML:

    <DataGridComboBoxColumn Header="Item Name" SelectedValueBinding="{Binding Path=Item_Id}" SelectedValuePath="ItemId" DisplayMemberPath="ItemName">
            <DataGridComboBoxColumn.ElementStyle>
                <Style TargetType="ComboBox">
<!-- modified this code as per suggestion ///-->
                    <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.ComboGrid }" />
                </Style>
            </DataGridComboBoxColumn.ElementStyle>
            <DataGridComboBoxColumn.EditingElementStyle>
                <Style TargetType="ComboBox">
                    <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=DataContext.ComboGrid }" />
                </Style>

            </DataGridComboBoxColu

mn.EditingElementStyle&GT;                 

网格中的仍然组合框显示空白。 Combobox中没有列出任何数据。然后,我在Windows codebehind中编写了以下代码,它开始工作。

((DataGridComboBoxColumn)this.testGrid.Columns[1]).ItemsSource = cls.ComboGrid.DefaultView;

无论如何使用MVVM在XMAL中处理这种情况?我不愿意使用这个项目。

1 个答案:

答案 0 :(得分:2)

如果itemsSource不在datagrids itemssource中,则必须找到祖先:

    <DataGridComboBoxColumn itemsSource="{binding RelativeSource={RelativeSource ancestortype=Page}, path=DataContext.YourComboboxItemsSource}" />

假设您的datagrid在页面上,您可以将ancestortype更改为任何内容。你可以在任何东西上使用relativeSource。必须使用它的原因是您尝试设置的itemssource不是层次结构的一部分,因此无法找到它。希望这可以帮助。

MVVM我会做类似的事情:

 public list<string> ComboboxGridItemsSource { get; set; }
 //Then add some data in the property above.
 ComboboxGridItemsSource.add("Hello world1"); , ect...

当此列表被更改/更新时,请记住使用INotifyPropertyChanged提升属性。

 //After you implement INotifyPropertyChanged you can raise like this:
 RaiseProperty("ComboboxGridItemsSource");

使用MVVM通常不会直接手动设置属性到控件,而是将属性绑定到xaml中的控件。