繁体   English   中英

MVVM Datagrid ComboBox 数据源未在选择时更新

[英]MVVM Datagrid ComboBox DataSource not Updating on Selection

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

While I am able to drop down and select the items in the boxes, my problem is when an item is selected it is not updating the DataTable records with that selection. 例如,如果在记录中我想在 ComboBox 中将一列设置为“计算机”,稍后查看该记录中的值,它会显示为空单元格而不是计算机。

在绑定 SelectedItem 然后用新的选择和新记录更新基础 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是没有意义的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM