Источник данных MVVM Datagrid ComboBox не обновляется при выборе

#c# #.net #wpf #mvvm

#c# #.net #wpf #mvvm

Вопрос:

У меня есть datagrid в проекте MVVM, в котором есть два столбца со списком. У меня есть таблица данных, так как это ItemsSource, а также коллекция ObservableObject в качестве источника элементов ComboBox. Существует экземпляр observableобъекта для выбранного элемента.

Хотя я могу раскрываться и выбирать элементы в полях, моя проблема заключается в том, что при выборе элемента он не обновляет записи, доступные для данных, с помощью этого выбора. Пример, если в записи я хочу установить столбец «Компьютер» в выпадающем списке, глядя на значение в этой записи позже, оно отображается как пустая ячейка вместо компьютера.

Что я делаю неправильно с точки зрения привязки выбранного элемента, а затем обновления базовой таблицы данных с помощью этого нового выбора и новой записи?

 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 ObservableCollectionlt;AddGroupObjectTypeModelgt; objectTypeTerms = new()  {  new AddGroupObjectTypeModel { ID = 1, ObjType = "User" },  new AddGroupObjectTypeModel { ID = 2, ObjType = "Group" },  new AddGroupObjectTypeModel { ID = 3, ObjType = "Computer" }  };   public IEnumerablelt;AddGroupObjectTypeModelgt; 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));  
 lt;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"   gt;  lt;DataGridTemplateColumn Header="Type"  x:Name="OType"  MinWidth="200"  gt;  lt;DataGridTemplateColumn.CellTemplategt;  lt;DataTemplategt;  lt;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}"  /gt;  lt;/DataTemplategt;  

Комментарии:

1. Какую колонку DataTable вы пытаетесь обновить?

2. В DataTable есть столбец для указанного выше типа объекта. Существует выпадающее поле со списком, которое позволяет выбрать. Конечная цель-пользователь вводит как можно больше записей, выбирая, возможно, разные элементы для каждой комбинации записей. Нажимается кнопка, и затем я хочу получить таблицу данных datagrid с этими значениями в поле объекта. В столбце данных «OType» выше в Xaml.

Ответ №1:

Вы должны привязать SelectedValue свойство the ComboBox к столбцу DataTable , который вы хотите обновить:

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

Нет смысла привязываться к обоим SelectedValue и SelectedItem .

Комментарии:

1. Вот и все! Спасибо, я несколько дней боролся с тем, что делал неправильно. Он устанавливал значение SelectedValue для имени столбца вместе с параметром UpdateSourceTrigger, исправил это.