如何将自定义类集合绑定到wpf datagrid组合框(多选)

时间:2015-01-05 20:48:58

标签: c# wpf xaml data-binding wpfdatagrid

请帮我弄清楚如何将自定义类集合绑定到datagrid组合框。 我的自定义类是

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 Datacontext 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,其他列显示正确的值.DataGridComboBoxColumn显示空白列。 UIParams集合具有多个参数,而每个参数都具有名称和可用值以及一个默认值。我想在datagrid中显示参数,让用户从Available column combobox中选择一个/多个值。 每个参数都有自己的一组可用值。我发现的大部分示例都有下拉列表中的Common集合,但在我的情况下,每行datagrid都有不同的可用值。

请帮我在数据网格中安装组合框。

提前致谢。

2 个答案:

答案 0 :(得分:0)

你的Combobox风格错了。 ItemsSource设置为Window,而从您的Model中,您不需要设置AncestorType。

Just {Binding}就足够了。实际上,您不需要ItemsSource Setter,因为您只是定义了Combobox的样式。只有在将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界面之前先学习一些基本知识。

答案 1 :(得分:0)

这帮助了我。

    <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>