0

使用 F#,我使用了 FreeBase 类型提供程序 (FSharp.Data) 来处理随机数据,但在可视化返回的数据时遇到了麻烦。当我使用(基于 WPF)DataGrid然后我ItemsSource用一些东西(化学元素,星星等)填充

我得到的是,当它DataGrid被填充时,它会“跳过”我想要可视化的那个实体的一些属性,例如每个实体都有的 MainImage。字符串的 IEnumerable 类型的其他属性也没有被可视化。

“未可视化”表示没有为该属性创建列。

在 Don Syme 的 F# 演示视频中,我看到他正在使用相同的东西(带有 WPF 的 DataGird),这是演示:http ://www.youtube.com/watch?v=-SGPEUuG1I8 (6 分钟)我是不确定他是否使用了自定义网格!我已经预料到,看着那个网格,它是默认的!因为它以非花哨的方式呈现所有属性!

我用来用 WPF 显示数据的代码

open System.Windows
open System.Xaml
open System.Windows.Controls
open System.Media

let main = new Window()
main.Height <- 600.0
main.Width <- 500.0

let grid = new DataGrid()
grid.SetValue(DataGrid.FontSizeProperty,20.0)  
main.Content <- grid

let show data =
     match main.IsLoaded with
     | true -> grid.ItemsSource <- data
     | false -> main.Show(); grid.ItemsSource <- data

我像这样使用它:

freebase.Commons.Astronomy.Stars |> Seq.take 10 |> show

数据检索工作正常,网格不呈现所有的东西!我在这里想念什么?

4

1 回答 1

1

使用的 ad-hoc 数据绑定grid.ItemsSource <- data默认假设data集合中的项目的基础类型允许将每个列值合理地呈现到网格单元中。但是这样的假设太强了,不可能总是正确的!

绑定表达式freebase.Commons.Astronomy.Stars |> Seq.take 10具有类型 seq<FreebaseData.ServiceTypes.Astronomy.Astronomy.StarData>。反过来,StarData属性可以是任何东西。比如property是自己Also known as构成IEnumerable的等等,应该如何默认渲染到grid cell呢?

相反,如果我们提供一个数据投影来确保绑定的默认可视化,那么一切都会好起来的。例如,显示距离地球最近的五颗恒星的名称和距离可以投影如下:

let astronomy = data.``Science and Technology``.Astronomy
let fiveClosestStars =
    query { for e in astronomy.Stars do
               where e.Distance.HasValue 
               sortBy e.Distance.Value
               take 5
               select (e.Name, e.Distance) } 

现在哪里fiveClosestStarsDataGrid-palatable type Linq.IQueryable<string * Nullable<float<Data.UnitSystems.SI.UnitNames.metre>>>。然后绑定

grid.ItemsSource <- fiveClosestStars 

产生预期的视觉体验

太阳 149597987918.808
比邻星 4.014161112E+16
狼 359 7.3747752E+16
天狼星 8.1461952E+16
牵牛星 1.58295384E+17

于 2013-11-02T04:03:04.400 回答