带有 checkListBox 下拉列表的 WPF 数据网格
WPF datagrid with checkListBox drop down
我对 WPF 开发还很陌生。我想创建一个包含以下列的 WPF 数据网格:复选框列、文本列、按钮列、清单框下拉列和组合框下拉列。我还需要将侦听器添加到清单框下拉列中。我使用 Infragistics Ultragrid 在 winforms 中创建了相同的内容。看起来像这样:
我阅读了有关使用 DataGridTemplateColumn 向 wpf 中的数据网格添加一些自定义控件的内容,但我不确定如何实现它。 Template 可以接受 Combobox 和 Checklistbox 吗?一个简短的代码示例会很棒。我是否必须使用 infragistics 或者这 UI 可以使用 WPF 标准控件来实现吗?
如有任何帮助,我们将不胜感激。
您可以使用标准 WPF 控件完成此操作。这是 WPF 最重要的部分之一——它非常灵活(通常不需要太多努力)。这是一个应该让您指向正确方向的示例:
<DataGrid AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="Selected"/>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Click Me!"
Command="{Binding myItemCommand}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Task"
Binding="{Binding TaskText}"/>
<DataGridTextColumn Header="Resources"
Binding="{Binding ResourcesText}"/>
<DataGridComboBoxColumn ItemsSource="{Binding AvailableStatuses}"
SelectedItemBinding="{Binding SelectedStatus}"
Header="Status" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding Resources}">
<DataGrid.Columns>
<DataGridCheckBoxColumn Binding="{Binding IsResourceUsed}"/>
<DataGridTextColumn Binding="{Binding ResourceName}"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
如上所示进入标签内部后,您可以在其中放置几乎所有您想要的控件,并且它们将在每一行中重复出现。每个项目的绑定都与该行代表的任何对象相关联,因此如果您有 DataGrid 正在显示的任务对象列表,则该列表中的每个任务都应该具有要绑定到 TaskText、ResourcesText 等的属性
编辑:更新了代码片段以显示 RowDetailsTemplate。如果一个 RowDetailsTemplate 里面有类似另一个 DataGrid 的东西不能完成工作,你总是可以写你自己的 multi-select 组合框,但它可能相当复杂,因为默认的组合框没有好的方法我知道允许您 select 多个项目。
我对 WPF 开发还很陌生。我想创建一个包含以下列的 WPF 数据网格:复选框列、文本列、按钮列、清单框下拉列和组合框下拉列。我还需要将侦听器添加到清单框下拉列中。我使用 Infragistics Ultragrid 在 winforms 中创建了相同的内容。看起来像这样:
我阅读了有关使用 DataGridTemplateColumn 向 wpf 中的数据网格添加一些自定义控件的内容,但我不确定如何实现它。 Template 可以接受 Combobox 和 Checklistbox 吗?一个简短的代码示例会很棒。我是否必须使用 infragistics 或者这 UI 可以使用 WPF 标准控件来实现吗?
如有任何帮助,我们将不胜感激。
您可以使用标准 WPF 控件完成此操作。这是 WPF 最重要的部分之一——它非常灵活(通常不需要太多努力)。这是一个应该让您指向正确方向的示例:
<DataGrid AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="Selected"/>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Click Me!"
Command="{Binding myItemCommand}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Task"
Binding="{Binding TaskText}"/>
<DataGridTextColumn Header="Resources"
Binding="{Binding ResourcesText}"/>
<DataGridComboBoxColumn ItemsSource="{Binding AvailableStatuses}"
SelectedItemBinding="{Binding SelectedStatus}"
Header="Status" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding Resources}">
<DataGrid.Columns>
<DataGridCheckBoxColumn Binding="{Binding IsResourceUsed}"/>
<DataGridTextColumn Binding="{Binding ResourceName}"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
如上所示进入标签内部后,您可以在其中放置几乎所有您想要的控件,并且它们将在每一行中重复出现。每个项目的绑定都与该行代表的任何对象相关联,因此如果您有 DataGrid 正在显示的任务对象列表,则该列表中的每个任务都应该具有要绑定到 TaskText、ResourcesText 等的属性
编辑:更新了代码片段以显示 RowDetailsTemplate。如果一个 RowDetailsTemplate 里面有类似另一个 DataGrid 的东西不能完成工作,你总是可以写你自己的 multi-select 组合框,但它可能相当复杂,因为默认的组合框没有好的方法我知道允许您 select 多个项目。