在 WPF 中动态创建 table (VB.Net)

Create table dynamically in WPF (VB.Net)

我想创建一个 editable table 它的大小由用户定义(大小可以是 10*10 或 20*20 或 30*30)。

--

我找到了这个主题 (here),但它在 WinForms 中 运行,并且 WPF 不支持 DataGridView。

我尝试使用 DataGrid,但下一行不起作用:

Me.DataGridTableau.ItemsSource = dt

--

我尝试使用 RadGridView (Telerik),但行仅由 ItemsSource 属性 更新table,而且我不知道会有多少列,我无法创建表示 table 的对象(x 列的 x 属性)。

有人可以帮助我吗?

您可以将 DataGridItemsSource 设置为任何 IEnumerable,包括 DataTableDataView:

Me.DataGridTableau.ItemsSource = dt.DefaultView

如果有人需要,我找到了使用 RadGridView (Telerik) 的解决方案:

创建这个 class :

Imports System.Dynamic
Imports System.Collections.Generic
Imports System.ComponentModel

Public Class MyDataRow
    Inherits DynamicObject
    Implements INotifyPropertyChanged

    ReadOnly data As IDictionary(Of String, Object)

    Public Sub New()
        data = New Dictionary(Of String, Object)()
    End Sub

    Public Sub New(ByVal source As IDictionary(Of String, Object))
        data = source
    End Sub

    Public Overrides Function GetDynamicMemberNames() As IEnumerable(Of String)
        Return data.Keys
    End Function

    Public Overrides Function TryGetMember(ByVal binder As GetMemberBinder, ByRef result As Object) As Boolean
        result = Me(binder.Name)
        Return True
    End Function

    Public Overrides Function TrySetMember(ByVal binder As SetMemberBinder, ByVal value As Object) As Boolean
        Me(binder.Name) = value
        Return True
    End Function

    Default Public Property Item(ByVal columnName As String) As Object
        Get
            If data.ContainsKey(columnName) Then
                Return data(columnName)
            End If

           Return Nothing
        End Get

    Set(ByVal value As Object)
        If Not data.ContainsKey(columnName) Then
            data.Add(columnName, value)
            OnPropertyChanged(columnName)
        Else
            If data(columnName) <> value Then
                data(columnName) = value
                OnPropertyChanged(columnName)
            End If
        End If
    End Set
End Property

Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

Protected Sub OnPropertyChanged(name As String)
    Try
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name))
    Catch
        If Debugger.IsAttached Then Debugger.Break()
        Throw ' rethrow exception
    End Try
End Sub
Protected Sub OnPropertyChanged(event_args As PropertyChangedEventArgs)
    RaiseEvent PropertyChanged(Me, event_args)
End Sub

End Class

在您的虚拟机中,您需要 public 属性 :

    Private _tableau As ObservableCollection(Of MyDataRow)
Public Property Tableau() As ObservableCollection(Of MyDataRow)
    Get
        Return _tableau
    End Get
    Set(ByVal value As ObservableCollection(Of MyDataRow))
        _tableau = value
        OnPropertyChanged("Tableau")
    End Set
End Property

您需要创建一个方法来加载您的 table :

   Private Function LoadTableau() As ObservableCollection(Of MyDataRow)
    Dim taille As Integer = Me.GetTailleTableau()
    If taille = 0 Then Return Nothing

    Dim data As New ObservableCollection(Of MyDataRow)()

    For i As Integer = 0 To (taille - 1)
        Dim row = New MyDataRow()

        For j As Integer = 0 To (taille - 1)
            'row(String.Format("Column{0}", j)) = String.Format("Cell {0} {1}", i, j)
            row(j) = ""
        Next

        data.Add(row)
    Next

    Return data
End Function

您需要加载您的 table :

Me.Tableau = Me.LoadTableau()

你需要绑定你的 table :

<telerik:RadGridView x:Name="RadGridViewTableau" ItemsSource="{Binding Tableau}" >

希望对您有所帮助:)