请帮我弄清楚如何将自定义类集合绑定到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都有不同的可用值。
请帮我在数据网格中安装组合框。
提前致谢。
答案 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>