Я пытаюсь написать автоматический тестовый комплект с использованием WPF и F #. Я хотел бы отображать совокупные результаты испытаний в виде строк в списке из нескольких столбцов. В идеале я хотел бы представить богатый контент в каждой ячейке, например, выделение проблем с помощью специальных тестов с использованием цвета или предоставление деталей через всплывающие подсказки. Тем не менее, я не могу понять, как поместить что-то более богатое, чем простая строка, в несколько столбцов ListView
.
Кроме того, я не фанат XAML или привязки данных и предпочитаю писать ванильный код F #. Самая простая программа, которую мне удалось написать, которая отображает многостолбцовый WPF 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
Хотя это работает, мне не нравится, когда требуется, чтобы имена полей дублировались как в определении типа, так и в виде строк, которые передаются в WPF, который, вероятно, затем использует отражение для разрешения их во время выполнения (yuk! ). В идеале я бы хотел Add
и obj array
, предоставляющих элементы управления WPF для каждой ячейки.
Способен ли ListView
на это? Если да, то как написать функцию, которая принимает двумерный массив элементов управления и возвращает ListView
, который их визуализирует?
Если нет, я, вероятно, вместо этого буду использовать Grid
. Я пробовал DataGrid
раньше, и это просто боль в сравнении ...
EDIT:
Благодаря ответам ниже, я смог найти решение. Функция multiColumnList
в программе ниже создает список элементов управления с заданными заголовками и содержимым с выбираемыми строками:
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