0

Silverlightで入力するのと同じ方法でWPFでデータグリッドを入力しようとしていますが、実際には同じように機能しないようです。

これはXAMLのグリッドです。

 <DataGrid x:Name="gvEintraege"
                            CanUserAddRows="False"
                            CanUserDeleteRows="False"
                  IsReadOnly="True"
                  AutoGenerateColumns="True" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Datum"
                                    Width="100"
                                Binding="{Binding datum}"/>
                <DataGridTextColumn Header="Gewicht"
                                    Width="70"
                                Binding="{Binding gewicht}"/>
                <DataGridTextColumn Header="Muskelmasse"
                                    Width="80"
                                Binding="{Binding muskelmasse}"/>
                <DataGridTextColumn Header="Fettmasse"
                                    Width="70"
                                Binding="{Binding fettmasse}"/>
                <DataGridTextColumn Header="BMI"
                                    Width="40"
                                Binding="{Binding bmi}"/>
                <DataGridTextColumn Header="FFMI"
                                    Width="50"
                                Binding="{Binding ffmi}"/>
                <DataGridTextColumn Header="KFA"
                                    Width="50"
                                Binding="{Binding kfa}"/>
            </DataGrid.Columns></DataGrid>

そして、これは背後にあるコード全体です:

Public Class LogWindow

Dim gvEintraege_Itemssource As New ObservableCollection(Of clsGridEintrag)
Public globaleVariablen As Application

Public Sub New()

    InitializeComponent()

    Me.globaleVariablen = Application.Current

    Me.getLogEintraege()

    Me.gvEintraege.ItemsSource = Me.gvEintraege_Itemssource
End Sub

Private Sub getLogEintraege()
    Try
        Dim myLog As clsLog = clsSerializer.DeSerialize(Me.globaleVariablen.standardPfadLogs & "\" & Me.globaleVariablen.aktiverUser & ".xml", New clsLog)
        With myLog
            For Each x In .eintraege
                Me.gvEintraege_Itemssource.Add(New clsGridEintrag(x.datum, x.gewicht, x.kfa, x.muskelmasse, x.fettmasse, x.ffmi, x.bmi))
            Next
        End With
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub


Public Class clsGridEintrag
    Public datum As Date
    Public gewicht As Decimal
    Public kfa As Decimal
    Public muskelmasse As Decimal
    Public fettmasse As Decimal
    Public ffmi As Decimal
    Public bmi As Decimal

    Public Sub New()

    End Sub

    Public Sub New(datum_ As Date, gewicht_ As Decimal, kfa_ As Decimal, muskelmasse_ As Decimal, fettmasse_ As Decimal, ffmi_ As Decimal, bmi_ As Decimal)
        Me.bmi = bmi_
        Me.datum = datum_
        Me.fettmasse = fettmasse_
        Me.ffmi = ffmi_
        Me.gewicht = gewicht_
        Me.kfa = kfa_
        Me.muskelmasse = muskelmasse_
    End Sub
End Class

エンドクラス

グリッドはitemssource内のすべてのアイテムの行を作成しますが、列にデータは表示されません。このように動作するように見えますが、どこかで間違いを犯したようです。とても簡単そうに見えるので、これの上に髪を引っ張っていますが、うまくいきません。

4

2 に答える 2

1

パブリックプロパティまたは依存関係プロパティを使用していないため、何も表示されていないと思います。バインドは、これら2つのいずれかでのみ機能します。パブリック変数にバインドしようとしているため、機能しません。デバッグ出力でも、バインディングが見つからないという警告が表示されると確信しています。

それ以外の場合は、「列の自動生成」をtrueに設定すると、列を指定する必要はありません。グリッドは、オブジェクトを読み取り(カスタムオブジェクトを含むobservablecollectionにバインドし)、パブリック依存関係プロパティまたはパブリックプロパティ(つまり、get / setアクセサーがある)ごとに1つの列を生成できる必要があります。

そして次の答えも正しいです、あなたはデータコンテキストを設定するのを忘れました;)

  1. DataContextが設定されていることを確認してください。
  2. window/controlクラスのパブリックプロパティとしてObservableCollectionを作成します。Public Property myCollection As New ObservableCollection<clsGridEintrag>()
  3. clsGridEintrag変数を、observablecollectionと同様に、「パブリックプロパティ」に変更します。
  4. DataGridのItemsSourceをにバインドしますmyCollection
  5. clsGridEintragオブジェクトを次々に追加して(を使用してmyCollection.Add(myObject))ObservableCollectionにデータを入力します。

私はコーディングコンピューターを使用していませんが、AutogenerateColumns = trueを使用している場合は、上記の結果が得られるはずです。DataGridは、clsEntraigオブジェクト内の各パブリックプロパティの名前にちなんで各ヘッダーに名前を付け、正しくリストする必要があります。

ここにいくつかの追加情報があります。「Customers」はおそらく「Customer」オブジェクトを含むObservableCollectionであることに注意してください。「Customer」オブジェクトでは、DataGridに表示する変数は「PublicProperty」として設定されている可能性があります(C#では、同等のものは次のようなものpublic string myString {get; set;}です-get / setが表示されている場合、それはプロパティです)。幸運を!

于 2012-12-22T14:10:34.137 に答える
0

プロパティを設定していないDataContextため、バインディングが機能しません...

LogWindowの場合

Public Sub New()

  Me.DataContext = Me.gvEintraege ' or wherever your data is 
  InitializeComponent()
  ....
End Sub
于 2012-12-22T14:11:03.673 に答える