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