WPF DataGridComboBoxColumn选中值重置及列排序问题咨询
Hey there! Let's work through your two DataGrid problems step by step—these are common pitfalls, so we’ll get them sorted quickly.
1. Fixing the Empty ComboBox & Selected Value Reset Problem
The root cause here is almost always incorrect binding setup for your DataGridComboBoxColumn. Either the selected value isn’t being persisted to your data model, or the combo box’s source/selected value bindings are misconfigured. Here’s how to fix it:
First, Ensure Your Data Model Tracks the Selected Value
Your data items need a property to store the selected operation (and it should implement INotifyPropertyChanged to keep the UI in sync):
public class DataItem : INotifyPropertyChanged { // Property to store the selected operation private string _selectedOperation; public string SelectedOperation { get => _selectedOperation; set { _selectedOperation = value; OnPropertyChanged(nameof(SelectedOperation)); } } // Your database-backed columns public string Column1 { get; set; } public string Column2 { get; set; } // INotifyPropertyChanged implementation public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName)); } }
Configure the ComboBox Column Correctly in Window_Load
When creating the column in code, make sure to use TwoWay binding for the selected value, and set a valid items source for the combo box:
private void Window_Loaded(object sender, RoutedEventArgs e) { // 1. Define your operation options var operationChoices = new List<string> { "Edit", "Delete", "Archive" }; // 2. Add Checkbox Column var selectCol = new DataGridCheckBoxColumn { Header = "选择" }; dataGrid.Columns.Add(selectCol); // 3. Add ComboBox Column (the critical part!) var comboCol = new DataGridComboBoxColumn { Header = "操作选择", ItemsSource = operationChoices, DisplayMemberPath = ".", // Use "." since we're binding to a string list // Bind selected value to your data item's SelectedOperation property SelectedValueBinding = new Binding("SelectedOperation") { Mode = BindingMode.TwoWay } }; dataGrid.Columns.Add(comboCol); // 4. Add database columns var col1 = new DataGridTextColumn { Header = "列1", Binding = new Binding("Column1") }; var col2 = new DataGridTextColumn { Header = "列2", Binding = new Binding("Column2") }; dataGrid.Columns.Add(col1); dataGrid.Columns.Add(col2); // 5. Load your database data (example) var dbData = new List<DataItem> { new DataItem { Column1 = "DB数据1", Column2 = "值A", SelectedOperation = "Edit" }, // Default selection new DataItem { Column1 = "DB数据2", Column2 = "值B" } // No default, will show empty initially }; dataGrid.ItemsSource = dbData; }
Key Fixes:
TwoWaybinding ensures the selected value is saved back to yourDataItemwhen the user picks an option, so switching rows won’t reset it.- Setting a default value for
SelectedOperationin your data items will fix the initial empty display.
2. Adjusting Column Order (Bound vs. Unbound)
Absolutely! Since you’re adding columns programmatically, you just need to change the order of your dataGrid.Columns.Add() calls. For example:
- If you want database columns first, then checkbox/combo box:
// Add database columns FIRST dataGrid.Columns.Add(col1); dataGrid.Columns.Add(col2); // Then add unbound columns dataGrid.Columns.Add(selectCol); dataGrid.Columns.Add(comboCol);
If you’re using auto-generated columns (with AutoGenerateColumns="True"), you can reorder them in the AutoGeneratingColumn event:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { // Move auto-generated (database) columns to the front if (e.PropertyName is "Column1" or "Column2") { dataGrid.Columns.Move(dataGrid.Columns.IndexOf(e.Column), 0); } }
内容的提问来源于stack exchange,提问作者tempidope

