Исходя из информации в комментариях к другому вопросу, вам, вероятно, нужно изменить SelectedValuePath="Status"
на SelectedValuePath="CNCComponentStatusKey"
. Имена столбцов или свойства элементов в выпадающем списке имеют решающее значение для ответа на этот вопрос, и вы их не предоставили.
Сетка обновит значение столбца DataRowView, когда ячейка выйдет из режима редактирования.
Mode=TwoWay
для этой привязки не требуется. Это режим по умолчанию для привязок на ComboBox.SelectedValue
.
Вы можете удалить все эти украшения из привязки на TextBlock.Text
: он вообще не может обновлять источник, когда вы думаете об этом, поэтому нет необходимости загромождать ваш XAML подробными инструкциями о том, как и когда это делать. должен сделать что-то, что он не может сделать в любом случае
Полный рабочий пример
Это код, с которым я проверял ответ выше. Обновляет строки в главной таблице. Это не сохраняет таблицу в базу данных. Это отдельная вещь.
Я не знаю, если ваши колонки не называются, как вы думаете, или как.
MainWindow.xaml.cs
public MainWindow()
{
InitializeComponent();
LoadData();
}
#region Lists
private static List<String> _status = new List<String>
{
"Ready",
"Not Ready",
"Weary",
"Disordered",
};
private static List<String> _words = new List<String>
{
"Ewwrigowasaus",
"Skubreuph",
"Creecroicr",
"Eunthaudrawtr",
"Ootwoww",
"Meuleetroithr",
"Rewshr",
"Scoysl",
"Scewziexul",
"Kawxayzeec",
};
#endregion Lists
protected void LoadData()
{
DataTable dtMain = new DataTable();
dtMain.Columns.Add("Status", typeof(int));
dtMain.Columns.Add("Programmer", typeof(String));
_words.ForEach(w =>
{
var row = dtMain.NewRow();
row[0] = ((int)w[0] % 2) + 1;
row[1] = w;
dtMain.Rows.Add(row);
});
DataTable dtStatus = new DataTable();
dtStatus.Columns.Add("CNCComponentStatusKey", typeof(int));
dtStatus.Columns.Add("Description", typeof(String));
_status.ForEach(s =>
{
var row = dtStatus.NewRow();
row[0] = dtStatus.Rows.Count + 1;
row[1] = s;
dtStatus.Rows.Add(row);
});
DataGrid.ItemsSource = dtMain.DefaultView;
var cvs = (FindResource("StatusItems") as CollectionViewSource);
cvs.Source = dtStatus.DefaultView;
}
MainWindow.xaml
<Window.Resources>
<CollectionViewSource x:Key="StatusItems" />
</Window.Resources>
<Grid>
<DataGrid x:Name="DataGrid" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Programmer}" Header="Programmer" />
<DataGridTemplateColumn Header="Status">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Status}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<ComboBox
ItemsSource="{Binding Source={StaticResource StatusItems}}"
SelectedValue="{Binding Status, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Description"
SelectedValuePath="CNCComponentStatusKey"
x:Name="Combo"
/>
<!-- Selected value in combo -->
<Label Content="{Binding SelectedValue, ElementName=Combo}" />
<!-- Value of Status column in row -->
<Label Content="{Binding Status}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>