如何在带有分组组合框的datagridtemplate列上显示分组项目标题 [英] How do I show grouped item headers on a datagridtemplatecolumn with a grouped combobox
问题描述
我有一个带有Grouped组合框的DataGridTemplateColumn。 Combobox在ItemSource中有一个ListCollectionView,有两个字段:TipoBienes_ID和Bienes_ID。
我想要的很简单,数据网格列中的一个组合允许我选择一个Bienes_ID但是TipoBienes_ID的团体是这样的:
TipoBienes_ID1
Bienes_ID1
Bienes_ID2
TipoBienes_ID2
Bienes_ID3
Bienes_ID4
我设法查看正确分组的项目,选择我想要的项目,但不是标题,而是出现浅蓝色空格(应该如此,但没有标题文本)。我知道我有一个绑定问题,但找不到它。我确信这是一件我想念的简单事情。我将代码中的datagrid(见下文)和datagridtemplatecolumn中的组合框与主窗口中的属性绑定。
这是我的HTML代码:
< DataGrid Grid.Row = 1 名称 = DetalleFactura AutoGenerateColumns = False >
< DataGrid.Columns >
< DataGridTemplateColumn x:名称 = ColumnaCombo >
< DataGridTemplateColumn.CellTemplate >
< DataTemplate >
< TextBlock 文字 = {Binding Path = Bienes_ID} > < / TextBlock >
< span class =code-keyword>< / DataTemplate >
< / DataGridTemplateColumn.CellTemplate >
< DataGridTemplateColumn.CellEditingTemplate >
< DataTemplate >
< ComboBox x:名称 = ComboBienesAgrupados SelectedValuePath = Bienes_ID ItemsSource = {Binding Path = ListaBienes,RelativeSource = {RelativeSource AncestorType = Window}} SelectedValue = {绑定Bienes_ID} >
< ComboBox.GroupStyle >
< GroupStyle >
< GroupStyle.HeaderTemplate >
< DataTemplate >
< TextBox 文字 = < span class =code-keyword> {Binding TipoBienes_ID} 背景 = AliceBlue > < / TextBox >
< / DataTemplate >
< / GroupStyle.HeaderTemplate >
< / GroupStyle >
< / ComboBox.GroupStyle >
< ComboBox.ItemTemplate >
< DataTemplate < span class =code-attribute> >
< < span class =code-leadattribute> TextBlock Text = {Binding Path = Bienes_ ID} < span class =code-keyword>> < / TextBlock >
< / DataTemplate < span class =code-keyword>>
< / ComboBox.ItemTemplate >
< / ComboBox >
< / DataTemplate >
< / DataGridTemplateColumn.CellEditingTemplate >
< / DataGridTemplateColumn >
< span class =code-keyword>< / DataGrid.Columns >
< / DataGrid >
这是填充数据网格和组合的部分:
公共 类 Bien
公开 属性 Bienes_ID 作为 < span class =code-keyword >字符串
公共 属性 TipoBienes_ID 正如 字符串
结束 班级
公开 班级 Bienes
继承 CatalogoWPF
Sub 新()
MyBase 。新(My.Settings.CadenaArchivo, 从Bienes订单中选择*由Bienes_ID, < span class =code-string> Bienes)
结束 Sub
公共 属性 Bienes_ID 作为 字符串
获取
返回 ObtainField( < span class =code-string> Bienes_ID)
结束 获取
设置(值作为 字符串)
SetField( Bienes_ID,value)
结束 设置
结束 属性
公共 属性 TipoBienes_ID < span class =code-keyword> As 字符串
获取
返回 ObtainField( TipoBienes_ID)
结束 获取
设置(值 As 字符串)
SetField( TipoBienes_ID ,value)
结束 设置
结束 属性
功能 ObtieneListaAgrupada () As ListCollectionView
Dim Lista As 新列表( Bien)
Dim i 作为 整数
Dim elemento As Bien
Dim salida As ListCollectionView
导航(PossibleDirections.FirstItem)
对于 i = 0 要计数 - 1
elemento = 新 Bien
elemento.Bienes_ID = Bienes_ID
elemento.TipoBienes_ID = TipoBienes_ID
Lista.Add(elemento)
导航(PossibleDirections.NextItem)
下一步
salida = 新 ListCollectionView(Lista)
salida.GroupDescriptions.Add(新 PropertyGroupDescription( TipoBienes_ID))
返回 salida
结束 功能
结束 Class
在datagrid所在的窗口中,我在Loaded Event中有这段代码:
公共 类 frmCapturaFacturas
Implements INotifyPropertyChanged
Dim m_Proveedores As Proveedores
Dim m_DetalleFacturas As DetalleFac turas
Dim m_DetalleImpuestosFacturas As DetalleImpuestosFacturas
Dim m_impuestosFacturas As DetalleImpuestosFacturas
Dim m_impuestos 作为 ImpuestosFacturas
Dim m_marcas 作为 Marcas
< span class =code-keyword> Dim m_bienes As Bienes
Dim m_tablaDetalle As DataTable
Dim m_tablabienes As DataView
Dim m_SubTotalFactura As Decimal
Dim m_SubTot alImpuestos As Decimal
Dim m_ListaBienes 作为 ListCollectionView
公开 事件 PropertyChanged 作为 PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
公共 属性 ListaBienes As ListCollectionView
获取
返回 m_ListaBienes
结束 获取
设置(值 As ListCollectionView)
m_ListaBiene s =值
结束 设置
结束 属性
私有 Sub frmCapturaFacturas_Loaded(sender As Object ,e As RoutedEventArgs)句柄 我 .Loaded
m_bienes = 新 Bienes()
ListaBienes = m_bienes.ObtieneListaAgrupada
m_bienes.Dispose()
m_DetalleFacturas = 新 DetalleFacturas
m_tablaDetalle = m_DetalleFacturas.CreaTabla
DetalleFactura.ItemsSource = m_tablaDetalle.DefaultView
结束 Sub
我的尝试:
我用一个纯文本=你好替换了Text ={Binding Path = TipoBienes_ID},并在每个标题上替换了该文字。我还用Text ={Binding Path = Bienes_ID}替换了Text ={Binding Path = TipoBienes_ID},并显示了相同的空格。
< pre lang =XML>显然有一个技巧,在标题中我没有绑定数据视图中的数据对象。相反,我绑定了PropertyGroupDescription对象。因此,不必绑定到TipoBienes_ID,我必须绑定到PropertyGroupDescription.name属性,如下所示:
< pre lang = xml >
< ; ComboBox.GroupStyle >
< GroupStyle >
< GroupStyle.HeaderTemplate >
< DataTemplate >
< TextBox 文字 = {Binding Path = Name} 背景 = AliceBlue > < / TextBox > ;
< / DataTemplate >
< / GroupStyle.HeaderTemplate >
< / GroupStyle >
< / pre >
I have a DataGridTemplateColumn with a Grouped combobox. The Combobox has as ItemSource a ListCollectionView with two fields: TipoBienes_ID and Bienes_ID.
What I want is simple, a combo within a datagrid column that allow me to pick one Bienes_ID but groups by TipoBienes_ID like this:
TipoBienes_ID1
Bienes_ID1
Bienes_ID2
TipoBienes_ID2
Bienes_ID3
Bienes_ID4
I have managed to view the items correctly grouped, select the one I want, but instead of the headers a light blue space appears (as it should, but without the header text). I know I have a Binding problem but cannot find it. I am sure it is a simple thing that I am missing. I am binding the datagrid in code (see below) and the combobox within the datagridtemplatecolumn with a property in the main window.
Here is my HTML code:
<DataGrid Grid.Row="1" Name="DetalleFactura" AutoGenerateColumns="False" >
<DataGrid.Columns >
<DataGridTemplateColumn x:Name="ColumnaCombo">
<DataGridTemplateColumn.CellTemplate >
<DataTemplate >
<TextBlock Text="{Binding Path=Bienes_ID}"></TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate >
<DataTemplate >
<ComboBox x:Name="ComboBienesAgrupados" SelectedValuePath="Bienes_ID" ItemsSource="{Binding Path=ListaBienes, RelativeSource={RelativeSource AncestorType=Window}}" SelectedValue="{Binding Bienes_ID}" >
<ComboBox.GroupStyle >
<GroupStyle>
<GroupStyle.HeaderTemplate >
<DataTemplate >
<TextBox Text="{Binding TipoBienes_ID}" Background ="AliceBlue" ></TextBox>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ComboBox.GroupStyle>
<ComboBox.ItemTemplate >
<DataTemplate >
<TextBlock Text="{Binding Path=Bienes_ID}" ></TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Here is the part that populates the datagrid and the combo:
Public Class Bien
Public Property Bienes_ID As String
Public Property TipoBienes_ID As String
End Class
Public Class Bienes
Inherits CatalogoWPF
Sub New()
MyBase.New(My.Settings.CadenaArchivo, "Select * from Bienes order by Bienes_ID", "Bienes")
End Sub
Public Property Bienes_ID As String
Get
Return ObtainField("Bienes_ID")
End Get
Set(value As String)
SetField("Bienes_ID", value)
End Set
End Property
Public Property TipoBienes_ID As String
Get
Return ObtainField("TipoBienes_ID")
End Get
Set(value As String)
SetField("TipoBienes_ID", value)
End Set
End Property
Function ObtieneListaAgrupada() As ListCollectionView
Dim Lista As New List(Of Bien)
Dim i As Integer
Dim elemento As Bien
Dim salida As ListCollectionView
Navigate(PossibleDirections.FirstItem)
For i = 0 To Count - 1
elemento = New Bien
elemento.Bienes_ID = Bienes_ID
elemento.TipoBienes_ID = TipoBienes_ID
Lista.Add(elemento)
Navigate(PossibleDirections.NextItem)
Next
salida = New ListCollectionView(Lista)
salida.GroupDescriptions.Add(New PropertyGroupDescription("TipoBienes_ID"))
Return salida
End Function
End Class
In the window where the datagrid resides, I have this code in the Loaded Event:
Public Class frmCapturaFacturas
Implements INotifyPropertyChanged
Dim m_Proveedores As Proveedores
Dim m_DetalleFacturas As DetalleFacturas
Dim m_DetalleImpuestosFacturas As DetalleImpuestosFacturas
Dim m_impuestosFacturas As DetalleImpuestosFacturas
Dim m_impuestos As ImpuestosFacturas
Dim m_marcas As Marcas
Dim m_bienes As Bienes
Dim m_tablaDetalle As DataTable
Dim m_tablabienes As DataView
Dim m_SubTotalFactura As Decimal
Dim m_SubTotalImpuestos As Decimal
Dim m_ListaBienes As ListCollectionView
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Public Property ListaBienes As ListCollectionView
Get
Return m_ListaBienes
End Get
Set(value As ListCollectionView)
m_ListaBienes = value
End Set
End Property
Private Sub frmCapturaFacturas_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
m_bienes = New Bienes()
ListaBienes = m_bienes.ObtieneListaAgrupada
m_bienes.Dispose()
m_DetalleFacturas = New DetalleFacturas
m_tablaDetalle = m_DetalleFacturas.CreaTabla
DetalleFactura.ItemsSource = m_tablaDetalle.DefaultView
End Sub
What I have tried:
I have replaced Text="{Binding Path=TipoBienes_ID}" with a plain Text="hello" and on every header that word appeard. Also I replaced Text="{Binding Path=TipoBienes_ID}" with Text="{Binding Path=Bienes_ID}" and the same blank space was shown.
Apparently there is a trick, in the header I am not binding against a data object from my dataview. Instead I am binding against PropertyGroupDescription object. So instead of binding to TipoBienes_ID I had to Bind to the PropertyGroupDescription.name property like this: <pre lang="xml"> <ComboBox.GroupStyle > <GroupStyle> <GroupStyle.HeaderTemplate> <DataTemplate > <TextBox Text="{Binding Path =Name}" Background ="AliceBlue" ></TextBox> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </pre>
这篇关于如何在带有分组组合框的datagridtemplate列上显示分组项目标题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!