WPFとF#を使用して自動テストハーネスを作成しようとしています。私は、集計テスト結果を複数列のリストに行として表示したいと思います。理想的には、各セルに豊富なコンテンツを提示したいと思います。カラーを使用した特定のテストの問題を強調表示したり、ツールチップを使用して詳細を表示できます。しかし、私は単純な文字列よりも豊富なものをマルチカラムListView
に入れる方法を理解することはできません。リッチなセルの内容を持つWPFの複数列のリスト
さらに、私は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
はこれが可能ですか?もしそうなら、2D配列のコントロールを受け入れ、それらを可視化する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
あなたは「さらに、私はXAMLやデータバインディングのファンではなく、バニラF#コードを書いています」と言い、これを前にDataGridを試してみました。 '最初の声明はそれが問題ではないのですか? –
@AngelWPF:いいえ、最初のステートメントは解決策です。痛みの世界が私がバニラ・コードを書くことを好む理由です。例えば、私が本当に望むのは、コントロールの2D配列をとり、それらを含む複数列のリストコントロールを返す関数です。 WPFはこれを必要以上に困難にします。 WPFの上記の例でのリフレクションの使用は、あらかじめ定義された固定数の列しか処理できないことを意味します。 –
なぜ2D配列がWPFの項目コントロールにバインドできないと思っていますか?XAMLを使用しているか、XAMLを使用していますか? 'FrameworkElementFactory'!でコーディングされた正しいテンプレートが必要です。 –