如何在带有分组组合框的datagridtemplate列上显示分组项目标题 [英] How do I show grouped item headers on a datagridtemplatecolumn with a grouped combobox

查看:103
本文介绍了如何在带有分组组合框的datagridtemplate列上显示分组项目标题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆