WPF DataGrid 中的 ComboBox 数据绑定是一种常见的需求,它允许用户在表格单元格中使用下拉列表选择值。这种绑定通常涉及两个主要部分:
<DataGrid ItemsSource="{Binding YourDataCollection}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn
Header="Category"
SelectedItemBinding="{Binding SelectedCategory}"
ItemsSource="{Binding Source={StaticResource Categories}}"
DisplayMemberPath="Name"
SelectedValuePath="Id"/>
</DataGrid.Columns>
</DataGrid>
<Window.Resources>
<CollectionViewSource x:Key="CategoriesSource" Source="{Binding Categories}"/>
</Window.Resources>
<DataGrid ItemsSource="{Binding Products}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}"/>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridComboBoxColumn
Header="Category"
SelectedItemBinding="{Binding Category}"
ItemsSource="{Binding Source={StaticResource CategoriesSource}}"
DisplayMemberPath="Name"/>
</DataGrid.Columns>
</DataGrid>
原因: 数据模型未实现 INotifyPropertyChanged 接口
解决方案:
public class Product : INotifyPropertyChanged
{
private Category _category;
public Category Category
{
get { return _category; }
set
{
_category = value;
OnPropertyChanged(nameof(Category));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
原因: 数据源未正确设置或绑定路径错误
解决方案:
原因: DataGrid 的绑定模式可能不正确
解决方案:
<DataGrid ItemsSource="{Binding Products, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
// 在ViewModel中
public ObservableCollection<Category> Categories { get; set; }
// 在XAML中
<DataGridComboBoxColumn
ItemsSource="{Binding DataContext.Categories, RelativeSource={RelativeSource AncestorType=Window}}"
SelectedItemBinding="{Binding Category}"/>
// 使用转换器根据行数据动态改变数据源
public class CategoryConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var product = value as Product;
// 根据product返回不同的数据源
return product?.AvailableCategories;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
没有搜到相关的文章