#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, исправил это.