如何将自定义 class 集合绑定到 wpf 数据网格组合框(多选)
how to bind custom class collections to wpf datagrid combobox (multiselected)
请帮我弄清楚如何将自定义 class 集合绑定到数据网格组合框。
我的习惯 class 是
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 数据上下文 i.g。
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 外,其他列显示正确 values.DataGridComboBoxColumn 显示空白列。 UIParams 集合有多个参数,每个参数都有名称和可用值以及一个默认值。我想在数据网格中显示参数,并让用户 select one/multiple 来自可用列组合框的值。
每个参数都有自己的一组可用值。我发现的大多数示例在下拉列表中都有 Common 集合,但在我的例子中,每一行数据网格都有不同的可用值。
请帮我在数据网格中添加组合框。
提前致谢。
您的组合框样式有误。 ItemsSource 设置为 Window 而从您的模型中,您不需要设置 AncestorType。
只要{Binding}就够了。实际上,您不需要 ItemsSource Setter,因为您只是在定义组合框的样式。仅当您将 ItemsSource 修改为其他内容时才需要它。在你的情况下,它不是。
编辑:
看看这个例子:Binding ItemsSource of a ComboBoxColumn in WPF DataGrid
我不明白您要求在每个数据项中都包含 AvailableValues 集合,而您在顶层拥有它,如下所示。
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>
请帮我弄清楚如何将自定义 class 集合绑定到数据网格组合框。 我的习惯 class 是
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 数据上下文 i.g。
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 外,其他列显示正确 values.DataGridComboBoxColumn 显示空白列。 UIParams 集合有多个参数,每个参数都有名称和可用值以及一个默认值。我想在数据网格中显示参数,并让用户 select one/multiple 来自可用列组合框的值。 每个参数都有自己的一组可用值。我发现的大多数示例在下拉列表中都有 Common 集合,但在我的例子中,每一行数据网格都有不同的可用值。
请帮我在数据网格中添加组合框。
提前致谢。
您的组合框样式有误。 ItemsSource 设置为 Window 而从您的模型中,您不需要设置 AncestorType。
只要{Binding}就够了。实际上,您不需要 ItemsSource Setter,因为您只是在定义组合框的样式。仅当您将 ItemsSource 修改为其他内容时才需要它。在你的情况下,它不是。
编辑: 看看这个例子:Binding ItemsSource of a ComboBoxColumn in WPF DataGrid 我不明白您要求在每个数据项中都包含 AvailableValues 集合,而您在顶层拥有它,如下所示。
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>