0

我在 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>

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

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

无论如何使用 MVVM 在 XMAL 本身中处理这种情况?我不愿意使用这种方法。

4

1 回答 1

2

如果 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 中的该控件。

于 2012-12-29T22:57:20.843 回答