2 Stimmen

Mehrspaltige Listen in WPF mit reichhaltigen Zellinhalten

Ich versuche, ein automatisiertes Test-Harness mit WPF und F# zu schreiben. Ich würde gerne die aggregierten Testergebnisse als Zeilen in einer mehrspaltigen Liste anzeigen. Im Idealfall möchte ich in jeder Zelle reichhaltige Inhalte darstellen, z. B. Probleme mit bestimmten Tests farblich hervorheben oder Details über Tooltips verfügbar machen. Ich kann jedoch nicht herausfinden, wie ich mehr als eine einfache Zeichenfolge in eine mehrspaltige Liste einfügen kann ListView .

Außerdem bin ich kein Fan von XAML oder Datenbindung und ziehe es vor, reinen F#-Code zu schreiben. Das einfachste Programm, das ich in der Lage war zu schreiben, die eine mehrspaltige WPF zeigt ListView です。

open System.Windows

let gridView = Controls.GridView()
let listView = Controls.ListView(View=gridView)

type SystemParams = { Name: string; Value: obj }

[<System.STAThread>]
do
  let column header binding =
    let binding = Data.Binding binding
    Controls.GridViewColumn(Header=header, DisplayMemberBinding=binding)

  for header, binding in ["Name", "Name"; "Value", "Value"] do
    column header binding
    |> gridView.Columns.Add

  for prop in typeof<SystemParameters>.GetProperties() do
    if prop.PropertyType <> typeof<ResourceKey> then
      { Name = prop.Name; Value = prop.GetValue(null, null) }
      |> listView.Items.Add
      |> ignore

  Application().Run(Window(Content=listView)) |> ignore

Obwohl dies funktioniert, mag ich nicht die Art und Weise, die es erfordert, dass die Feldnamen sowohl in der Typdefinition als auch als Zeichenfolgen dupliziert werden, die an WPF gefüttert werden, die vermutlich dann Reflexion verwendet, um sie zur Laufzeit aufzulösen (yuk!). Idealerweise würde ich gerne Add eine obj array mit den WPF-Steuerelementen für jede Zelle.

Ist ListView zu so etwas fähig? Wenn ja, wie kann man eine Funktion schreiben, die ein 2D-Array von Steuerelementen akzeptiert und ein ListView die sie visualisiert?

Wenn nicht, werde ich wahrscheinlich eine Grid stattdessen. Ich habe versucht DataGrid und im Vergleich dazu ist es einfach eine Welt der Schmerzen...

EDITAR:

Dank der nachstehenden Antworten konnte ich eine Lösung finden. Die multiColumnList Funktion im folgenden Programm erstellt eine Liste von Steuerelementen mit den angegebenen Überschriften und Inhalten mit auswählbaren Zeilen:

open System.Windows

let multiColumnList columns contents onSelection =
  let gridView = Controls.GridView()
  let list = Controls.ListView(View=gridView)
  let column index header =
    let binding = Data.Binding(sprintf "[%d]" index)
    Controls.GridViewColumn(Header=header, DisplayMemberBinding=binding)
    |> gridView.Columns.Add
  Seq.iteri column columns
  list.ItemsSource <-
    [|for row in contents ->
        [|for elt in row ->
            box elt|]|]
  list.SelectionChanged.Add onSelection
  list

[<System.STAThread>]
do
  let columns = ["Name"; "Value"]
  let contents =
    [ for prop in typeof<SystemParameters>.GetProperties() do
        if prop.PropertyType <> typeof<ResourceKey> then
          yield [box prop.Name; prop.GetValue(null, null)] ]
  Application().Run(Window(Content=multiColumnList columns contents ignore))
  |> ignore

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X