MVVM Datagrid ComboBox 数据源未根据选择更新

MVVM Datagrid ComboBox DataSource not Updating on Selection

我在 MVVM 项目中有一个数据网格,它有两个 ComboBox 列。我有一个 DataTable 作为 ItemsSource,还有一个 ObservableObject Collection 作为 ComboBox 项目的来源。存在所选项目的 ObservableObject 实例。

虽然我可以下拉 select 框中的项目,但我的问题是当一个项目被 selected 时,它没有用 select 更新 DataTable 记录]离子。例如,如果在一条记录中,我想在 ComboBox 中将一列设置为“Computer”,稍后查看该记录中的值,它显示为一个空单元格而不是 Computer。

我在绑定 SelectedItem 然后用新 selection 和新记录更新基础 DataTable 方面做错了什么?

    public class AddGroupObjectTypeModel : ObservableObject
    {
        #region Properties
        private int iD;
        public int ID
        {
            get
            {
                return iD;
            }
            set
            {
                if (iD != value)
                {
                    iD = value;
                    OnPropertyChanged();
                }
            }
        }

        private string objType;
        public string ObjType
        {
            get
            {
                return objType;
            }
            set
            {
                if (objType != value)
                {
                    objType = value;
                    OnPropertyChanged();
                }
            }
        }
        #endregion
    }
        private readonly ObservableCollection<AddGroupObjectTypeModel> objectTypeTerms = new()
        {
            new AddGroupObjectTypeModel { ID = 1, ObjType = "User" },
            new AddGroupObjectTypeModel { ID = 2, ObjType = "Group" },
            new AddGroupObjectTypeModel { ID = 3, ObjType = "Computer" }
        };

        public IEnumerable<AddGroupObjectTypeModel> ObjectTypeTerms
        {
            get { return objectTypeTerms; }
        }

        private AddGroupObjectTypeModel selectedObjectTypeTerm = new();
        public AddGroupObjectTypeModel SelectedObjectTypeTerm
        {
            get { return selectedObjectTypeTerm; }
            set { selectedObjectTypeTerm = value; OnPropertyChanged(); }
        }

        private DataTable objectsDisplayTable;
        public DataTable ObjectsDisplayTable
        {
            get { return objectsDisplayTable; }
            set { objectsDisplayTable = value; OnPropertyChanged(); }
        }

            ObjectsDisplayTable = new("Temporary Table");
            ObjectsDisplayTable.Columns.Add("ObjectName", typeof(String));
            ObjectsDisplayTable.Columns.Add("OType", typeof(String));
            ObjectsDisplayTable.Columns.Add("ODomain", typeof(String));
    <DataGrid x:Name="ObjectsTable"
                                          AutoGenerateColumns="False"
                                          Grid.Row="1"
                                          CanUserResizeColumns="True"
                                          Margin="2,0,0,0" 
                                          Style="{StaticResource ThemedDataGrid}"
                                          BorderBrush="{x:Null}"
                                          ItemsSource="{Binding ObjectsDisplayTable,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                                          HorizontalAlignment="Stretch" 
                                          VerticalAlignment="Stretch"
                                          CanUserAddRows="True"
                                          SelectionMode="Single"
                                          SelectionUnit="Cell" 
                                          >

<DataGridTemplateColumn Header="Type"
                                                        x:Name="OType"
                                                        MinWidth="200"
                                                        >
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <ComboBox ItemsSource="{Binding Path=DataContext.ObjectTypeTerms, RelativeSource={RelativeSource AncestorType=DataGrid}}"
                                                      DisplayMemberPath="ObjType"
                                                      SelectedItem="{Binding Path=DataContext.SelectedObjectTypeTerm.ObjType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,RelativeSource={RelativeSource AncestorType=DataGrid}}"
                                                      SelectedValue="{Binding Path=DataContext.SelectedObjectTypeTerm.ID, RelativeSource={RelativeSource AncestorType=DataGrid}}"
                                                      SelectedValuePath="ID"
                                                      SelectedIndex="0"
                                                      IsSynchronizedWithCurrentItem="false"
                                                      Style="{StaticResource ComboBoxTheme}"
                                                       />
                                        </DataTemplate>

您应该将 ComboBoxSelectedValue 属性 绑定到要更新的 DataTable 的列:

<ComboBox ItemsSource="{Binding Path=DataContext.ObjectTypeTerms, RelativeSource={RelativeSource AncestorType=DataGrid}}"
          DisplayMemberPath="ObjType"
          SelectedValuePath="ObjType"
          SelectedValue="{Binding OType, UpdateSourceTrigger=PropertyChanged}"
          SelectedIndex="0"
          Style="{StaticResource ComboBoxTheme}" />

同时绑定到 SelectedValueSelectedItem 是没有意义的。