如何将自定义类集合绑定到 WPF 数据网格组合框(多选)
本文关键字:组合 网格 数据网 多选 数据 WPF 自定义 集合 绑定 | 更新日期: 2023-09-27 18:36:24
请帮助我弄清楚如何将自定义类集合绑定到数据网格组合框。我的自定义类是
class Test: INotifyPropertyChanged
{
public String Name { get; set; }
public UserAvailableValue SelectedAvailableValue { get; set; }
public ObservableCollection<UserAvailableValue> AvailableValues { get; set; }
public ObservableCollection<String> DefaultValues { get; set; }
public String SelectedValue { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public class UserAvailableValue
{
public Object Value { get; set; }
public Object Label { get; set; }
}
从代码隐藏中,我正在设置 DataGrid 数据上下文,例如
ObservableCollection<Test> UIParams = new ObservableCollection<Test>();
// code to fill UIParams collection
dgReportparameters.DataContext = UIParams;
//XAML Code
<DataGrid Name="dgReportparameters" ItemsSource="{Binding}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridComboBoxColumn Header="Available Values" SelectedItemBinding=
"{Binding SelectedAvailableValue, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Label">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=AvailableValues,
RelativeSource={RelativeSource AncestorType=Window}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
</DataGridComboBoxColumn>
<DataGridTextColumn Header="Default Values" Binding="{Binding SelectedValue}"/>
<DataGridCheckBoxColumn Header="Nullable" Binding="{Binding IsNullable}"/>
</DataGrid.Columns>
</DataGrid>
除了 DataGridComboBoxColumn 之外,其他列都显示正确的值。DataGridComboBoxColumn 显示空白列。UIParams 集合具有多个参数,而每个参数具有名称和可用值以及一个默认值。我想在数据网格中显示参数,并让用户从可用列组合框中选择一个或多个值。每个参数都有自己的一组可用值。我找到的大多数示例在下拉列表中都有 Common 集合,但就我而言,数据网格的每一行都有不同的可用值。
请帮助我在数据网格中拥有组合框。
提前谢谢。
您的组合框样式是错误的。ItemsSource 设置为 Window,而从模型中,您不需要设置 AncestorType。
只需{绑定}就足够了。实际上,您不需要 ItemsSource Setter,因为您只是在定义组合框的样式。仅当您将 ItemsSource 修改为其他内容时,才需要它。在您的情况下,它不是。
编辑:看看这个例子: 绑定项WPF DataGrid 中 ComboBoxColumn 的来源我不明白您在顶级中的每个数据项中都有可用值集合的要求,如下所示。
public class MyClass
{
public List<Test> Items{get;set;}
public List<AvailableValue> AvailableValues { get;set;}
}
我还注意到您已经实现了INotifyPropertyChanged
接口,并且没有在每个属性集上引发更改事件。
我建议您在开始处理WPF和INotifyPropertyChanged
接口之前先学习一些基础知识。
这对
我有帮助。
<DataGridComboBoxColumn Header="Available Values" SelectedItemBinding=
"{Binding SelectedAvailableValue, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Label">
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=AvailableValues}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>