【问题标题】:How to bind DataTable to DataGridComboBoxColumn如何将 DataTable 绑定到 DataGridComboBoxColumn
【发布时间】:2012-12-29 22:30:43
【问题描述】:

我在DataGrid 中有一个WPF 窗口中的DataGridComboBoxColumn 和DataGridComboBoxColumn。我将 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>

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

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

有没有办法在 XMAL 本身中使用 MVVM 来处理这种情况?我不愿意使用这种方法。

【问题讨论】:

    标签: wpf mvvm datagridcomboboxcolumn


    【解决方案1】:

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

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

    假设您的数据网格位于页面上,您可以将祖先类型更改为任何内容。不过,您可以在任何东西上使用 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 中将属性绑定到该控件。

    【讨论】:

    • 但是这种方法对我不起作用。相反,它为我提供了解决上述问题的提示。我修改了我的原始帖子以应用此结果。它对我来说非常有效。谢谢
    猜你喜欢
    • 2021-06-28
    • 2011-07-10
    • 2011-12-21
    • 2020-09-27
    • 2018-03-12
    • 2020-08-14
    • 2015-11-24
    • 1970-01-01
    • 2019-06-08
    相关资源
    最近更新 更多