使用F#(类型提供程序)可视化Freebase数据

时间:2013-11-01 23:38:24

标签: wpf datagrid f# type-providers f#-3.0

使用F#,我使用了FreeBase类型提供程序(FSharp.Data)来处理随机数据,我无法可视化返回的数据。当我使用(基于WPF)DataGrid然后我用{(1}}填充某些东西(化学元素,星等)时填充

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

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

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

代码我以前用WPF显示数据

DataGrid

我这样用它:

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

数据检索工作正常,网格不会渲染所有东西!我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

使用过的ad-hoc数据绑定grid.ItemsSource <- data默默地假设data集合中的基础类型的项允许将每个列值合理地呈现到网格单元中。但是这样的假设太强大而不能永远是真的!

绑定表达式freebase.Commons.Astronomy.Stars |> Seq.take 10具有类型 seq<FreebaseData.ServiceTypes.Astronomy.Astronomy.StarData>。反过来,StarData属性可能是任何东西。例如,属性Also known as本身构成IEnumerable,等等。默认情况下应该如何呈现给网格单元格?

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

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) } 

其中fiveClosestStars现在有DataGrid - 可口的类型 Linq.IQueryable<string * Nullable<float<Data.UnitSystems.SI.UnitNames.metre>>>。然后绑定

grid.ItemsSource <- fiveClosestStars 

产生预期的视觉体验

  

孙149597987918.808
  Proxima Centauri 4.014161112E + 16
  沃尔夫359 7.3747752E + 16
  天狼星8.1461952E + 16
  牵牛星1.58295384E + 17