easpc Ответов: 1

Как показать заголовки сгруппированных элементов в столбце datagridtemplatecolumn с помощью сгруппированного combobox


У меня есть DataGridTemplateColumn с сгруппированным combobox. Combobox имеет в качестве ItemSource ListCollectionView с двумя полями: TipoBienes_ID и Bienes_ID.

То, что я хочу, это просто, комбо в столбце datagrid, которое позволяет мне выбрать один Bienes_ID, но группирует по TipoBienes_ID следующим образом:

TipoBienes_ID1
Bienes_ID1
Bienes_ID2
TipoBienes_ID2
Bienes_ID3
Bienes_ID4

Мне удалось просмотреть элементы, правильно сгруппированные, выбрать тот, который я хочу, но вместо заголовков появляется светло-синее пространство (как и должно быть, но без текста заголовка). Я знаю, что у меня есть проблема с привязкой, но не могу ее найти. Я уверен, что это простая вещь, которую я упускаю. Я связываю datagrid в коде (см. ниже) и combobox в столбце datagridtemplatecolumn со свойством в главном окне.

Вот мой HTML код:

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

Вот та часть, которая заполняет datagrid и 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

В окне, где находится datagrid, у меня есть этот код в загруженном событии:

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


Что я уже пробовал:

Я заменил Text= " {Binding Path=TipoBienes_ID}"на обычный текст=" hello", и в каждом заголовке появляется это слово. Также Я заменил текст="{путь привязки=TipoBienes_ID}" текст="{путь привязки=Bienes_ID}" и такой же пробел был показан.

1 Ответов

Рейтинг:
2

easpc

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>