8 people like it.
    Like the snippet!
  
  A fun-ny WPF DataTemplate DSL
  Parts of a little DSL to create WPF DataTemplate's in F#. Don't even want to think about the length of a corresponding C#. The F# code corresponds 1-to-1 to the visual tree constructed for the template.
   1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
  | 
    let inline (|&) x a = x |> a |> ignore; x
    let inline fac<'T>() = FrameworkElementFactory(typeof<'T>)    
    let inline (<>=) o p v = ( ^a : (member SetValue   : DependencyProperty -> obj              -> unit) (o, p, v) )
    let inline (<>~) o p b = ( ^a : (member SetBinding : DependencyProperty -> Data.BindingBase -> unit) (o, p, Data.Binding b) )
    let inline (<>+) o v   = ( ^a : (member AppendChild : 'b -> unit) (o, v) )
    let inline (<>~<) o p (b,c) =
        ( ^a : (member SetBinding : DependencyProperty -> Data.BindingBase -> unit) (o, p, Data.Binding b |& fun x -> x.Converter <- c) )
    let makeValueConverter (f,g) =
        {
            new Data.IValueConverter with
                member this.Convert    (v, tt, p, c) = f v
                member this.ConvertBack(v, tt, p, c) = g v
        }
    let inline (>=<) (f : 'a -> 'b) (g : 'b -> 'a) = makeValueConverter (unbox >> f >> box,unbox >> g >> box)
    let inline (<>++) o vs = ((vs |> Seq.toArray) |>|! (<>+) o) |> ignore
    let inline (<>|+) o e h = ( ^a : (member AddHandler : RoutedEvent -> 'd -> unit) (o, e, h) )
//////////////////////////// USAGE
    let itemTemplate =
        let c2 = CORSIS.PDF.Windows.Documents.Overlays.reasonColor >> brush >=< fun _ -> ""
        DataTemplate() |& fun dt ->
            dt.DataType   <- typeof<Bookmark Choice>
            dt.VisualTree <- fac<StackPanel>() |& fun sp ->
                sp <>= StackPanel.OrientationProperty <| Orientation.Horizontal
                sp <>++
                    [
                        fac<TextBlock>() |& fun tb ->
                            tb <>~< TextBlock.TextProperty <| ("Value.PageIndex", (+) 1 >=< (-) 1)
                            tb <>=  TextBlock.FontFamilyProperty <| FontFamily "Consolas"
                            tb <>=  TextBlock.ForegroundProperty <| Brushes.LightGray
                        fac<TextBlock>() |& fun tb ->
                            tb <>=  TextBlock.TextProperty <| " "
                            tb <>~< TextBlock.BackgroundProperty <| ("Value.Reason", c2)
                            tb <>=  TextBlock.MarginProperty <| Thickness(4., 1., 4., 1.)
                        fac<TextBlock>() |& fun tb -> tb <>~  TextBlock.TextProperty <| "Value.Text"
                    ]
  | 
val x : 'a
val a : ('a -> 'b)
val ignore : value:'T -> unit
Full name: Microsoft.FSharp.Core.Operators.ignore
val fac<'T> : unit -> obj
Full name: Script.fac
val typeof<'T> : System.Type
Full name: Microsoft.FSharp.Core.Operators.typeof
val o : 'a (requires member SetValue)
val p : 'a
val v : 'b
type obj = System.Object
Full name: Microsoft.FSharp.Core.obj
type unit = Unit
Full name: Microsoft.FSharp.Core.unit
val o : 'a (requires member SetBinding)
val b : 'c
namespace Microsoft.FSharp.Data
val o : 'a (requires member AppendChild)
val c : 'd
val x : 'b
val makeValueConverter : f:'a * g:'b -> 'c
Full name: Script.makeValueConverter
val f : 'a
val g : 'b
val f : ('a -> 'b)
val g : ('b -> 'a)
val unbox : value:obj -> 'T
Full name: Microsoft.FSharp.Core.Operators.unbox
val box : value:'T -> obj
Full name: Microsoft.FSharp.Core.Operators.box
val o : 'a
val vs : 'a (requires 'a :> seq<'b>)
module Seq
from Microsoft.FSharp.Collections
val toArray : source:seq<'T> -> 'T []
Full name: Microsoft.FSharp.Collections.Seq.toArray
val o : 'a (requires member AddHandler)
val e : 'a
val h : 'd
val itemTemplate : obj
Full name: Script.itemTemplate
val c2 : obj
val dt : obj
Multiple items
type Choice<'T1,'T2> =
  | Choice1Of2 of 'T1
  | Choice2Of2 of 'T2
Full name: Microsoft.FSharp.Core.Choice<_,_>
--------------------
type Choice<'T1,'T2,'T3> =
  | Choice1Of3 of 'T1
  | Choice2Of3 of 'T2
  | Choice3Of3 of 'T3
Full name: Microsoft.FSharp.Core.Choice<_,_,_>
--------------------
type Choice<'T1,'T2,'T3,'T4> =
  | Choice1Of4 of 'T1
  | Choice2Of4 of 'T2
  | Choice3Of4 of 'T3
  | Choice4Of4 of 'T4
Full name: Microsoft.FSharp.Core.Choice<_,_,_,_>
--------------------
type Choice<'T1,'T2,'T3,'T4,'T5> =
  | Choice1Of5 of 'T1
  | Choice2Of5 of 'T2
  | Choice3Of5 of 'T3
  | Choice4Of5 of 'T4
  | Choice5Of5 of 'T5
Full name: Microsoft.FSharp.Core.Choice<_,_,_,_,_>
--------------------
type Choice<'T1,'T2,'T3,'T4,'T5,'T6> =
  | Choice1Of6 of 'T1
  | Choice2Of6 of 'T2
  | Choice3Of6 of 'T3
  | Choice4Of6 of 'T4
  | Choice5Of6 of 'T5
  | Choice6Of6 of 'T6
Full name: Microsoft.FSharp.Core.Choice<_,_,_,_,_,_>
--------------------
type Choice<'T1,'T2,'T3,'T4,'T5,'T6,'T7> =
  | Choice1Of7 of 'T1
  | Choice2Of7 of 'T2
  | Choice3Of7 of 'T3
  | Choice4Of7 of 'T4
  | Choice5Of7 of 'T5
  | Choice6Of7 of 'T6
  | Choice7Of7 of 'T7
Full name: Microsoft.FSharp.Core.Choice<_,_,_,_,_,_,_>
  
  
  More information