如何将自定义 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>