WPF 将 DataGridComboBoxColumn 绑定到 ComboBox 的 SelectedItem

WPF Binding DataGridComboBoxColumn to SelectedItem of a ComboBox

我正在 WPF (MVVM) 中构建应用程序。 用户将在 ComboBox 中进行选择,并且该选择应该在 DataGrid.

中过滤 DataGridComboBoxColumn (DGCBC) 中可用的结果

但是我不知道如何将 ComboBox SelectedItem 绑定到 DGCBC。我确实设法让 ComboBox 过滤了第二个 ComboBox 的结果,但该逻辑似乎并不适用于 DGCBC 运行。

我尝试过的:

我的ComboBox:

<ComboBox
    DisplayMemberPath="PropertyName1"
    ItemsSource="{Binding Collection1}"
    Loaded="{s:Action NameOfMethodToPopulateComboBox}"
    SelectedItem="{Binding PropertyHolder, UpdateSourceTrigger=PropertyChanged}"/>

当在 ComboBox 中选择一个项目时,PropertyHolder 是 运行,如果它不为空,它运行添加到 ObservableCollection 的方法绑定到 DGCBC。看起来像这样:

private ClassName _currentSelectedItem;
public ClassName CurrentSelectedItem {
    get { return this,._selectedItem; }
    set { SetAndNotify(ref this._selectedItem, value);
        if (value != null) {
           FillDataGridComboBoxColumn();
        }
    }
}

方法,FillDataGridComboBoxColumn() 看起来像这样(缩写):

DataSet ds = new();
    // Code to run stored procedure
    // CurrentSelectedItem is given as parameter value

DataTable dt = new();
dt = ds.Tables[0];

MyObservableCollection.Clear();

for (int i = 0; i < dt.Rows.Count; i++) {

    DataRow dr = dt.NewRow();
    dr = dt.Rows[i];
    HolderClass holderClass = new(); // this is the class that is bound to the observablecollection
    holderClass.PropertyName = dr["PropertyName2"].ToString();
    MyObservableCollection.Add(holderClass);

这是 DataGridDataGridComboBoxColumn 的 XAML:

<DataGrid
    AutoGenerateColumns="False"
    ItemsSource="{Binding MyObservableCollection}">

        <DataGridComboBoxColumn
            SelectedValueBinding="{Binding PropertyName2, UpdateSourceTrigger=PropertyChanged}"
            SelectedValuePath="PropertyName2"
            DisplayMemberPath="PropertyName2"
            ItemsSource="{Binding MyObservableCollection}">
/>

</DataGrid>

当我调试时,DataGridComboBoxColumn 能够得到正确的行数——但它们只是空的占位符;空白。如果我在代码中放置一个断点,我会看到该集合确实加载了正确的值,但它们只是没有显示。

我猜我对 DGCBC 的绑定做错了。

谢谢。

DataGridComboBoxColumn ItemSource 必须设置为 Static Resource:

<Window.Resources>
    <CollectionViewSource x:Key="MyObservableCollection" Source="{Binding MyObservableCollection}"/>
</Window.Resources>

然后,在 XAML 中 DataGridComboBoxColumn:

<DataGridComboBoxColumn
    ItemsSource="{Binding Source={StaticResource MyObservableCollection}}"
    DisplayMemberPath="Property2">
</DataGridComboBoxColumn>