90 people like it.

WPF / SilverLight Converter II

version 1 is http://fssnip.net/62. This new version support convert from any existing function to a converter function by using composition and pipeline. The convert function is to make the function signature agree to the IValueConverter interface. You can add new functions in the FunctionLibrary module and reuse the class definition to reduce the coding effort. The first sample is to show how to make the converter pipeline work, the second one is a debugger converter used to debug the data binding problem.

 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: 
43: 
44: 
45: 
namespace FSharp.Converters

open System
open System.Windows
open System.Windows.Data
open Microsoft.FSharp.Reflection

[<AutoOpen>]
module FunctionLibrary = 
    let nullFunction = fun value _ _ _ -> value
    let stringToInt (a:Object) = Convert.ToInt32(a)
    let intToBool = fun i -> i = 0
    let boolToVisibility = fun b -> 
        if b then Visibility.Visible
        else Visibility.Collapsed

    let convert<'T> f (obj:System.Object) (t:Type) (para:System.Object) (culture:Globalization.CultureInfo)  = (obj :?> 'T) |> f |> box
    

/// abstract class for converter
[<AbstractClass>]
type ConverterBase(convertFunction, convertBackFunction) =    
    /// constructor take nullFunction as inputs
    new() = ConverterBase(nullFunction, nullFunction)

    // implement the IValueConverter
    interface IValueConverter with
        /// convert a value to new value
        override this.Convert(value, targetType, parameter, culture) =
            this.Convert value targetType parameter culture

        /// convert a value back
        override this.ConvertBack(value, targetType, parameter, culture) =
            this.ConvertBack value targetType parameter culture
    
    abstract member Convert : (obj -> Type -> obj -> Globalization.CultureInfo -> obj)
    default this.Convert = convertFunction

    abstract member ConvertBack : (obj -> Type -> obj -> Globalization.CultureInfo -> obj)
    default this.ConvertBack = convertBackFunction

/// Sample concrete implementation

type StringToVisiblityConverter() =
    inherit ConverterBase(stringToInt>>intToBool>>boolToVisibility |> convert, nullFunction)
namespace Microsoft.FSharp
namespace System
namespace System.Windows
Multiple items
namespace System.Data

--------------------
namespace Microsoft.FSharp.Data
namespace Microsoft
namespace Microsoft.FSharp.Reflection
Multiple items
type AutoOpenAttribute =
  inherit Attribute
  new : unit -> AutoOpenAttribute
  new : path:string -> AutoOpenAttribute
  member Path : string

Full name: Microsoft.FSharp.Core.AutoOpenAttribute

--------------------
new : unit -> AutoOpenAttribute
new : path:string -> AutoOpenAttribute
val nullFunction : value:'a -> 'b -> 'c -> 'd -> 'a

Full name: FSharp.Converters.FunctionLibrary.nullFunction
val value : 'a
val stringToInt : a:Object -> int

Full name: FSharp.Converters.FunctionLibrary.stringToInt
val a : Object
Multiple items
type Object =
  new : unit -> obj
  member Equals : obj:obj -> bool
  member GetHashCode : unit -> int
  member GetType : unit -> Type
  member ToString : unit -> string
  static member Equals : objA:obj * objB:obj -> bool
  static member ReferenceEquals : objA:obj * objB:obj -> bool

Full name: System.Object

--------------------
Object() : unit
type Convert =
  static val DBNull : obj
  static member ChangeType : value:obj * typeCode:TypeCode -> obj + 3 overloads
  static member FromBase64CharArray : inArray:char[] * offset:int * length:int -> byte[]
  static member FromBase64String : s:string -> byte[]
  static member GetTypeCode : value:obj -> TypeCode
  static member IsDBNull : value:obj -> bool
  static member ToBase64CharArray : inArray:byte[] * offsetIn:int * length:int * outArray:char[] * offsetOut:int -> int + 1 overload
  static member ToBase64String : inArray:byte[] -> string + 3 overloads
  static member ToBoolean : value:obj -> bool + 17 overloads
  static member ToByte : value:obj -> byte + 18 overloads
  ...

Full name: System.Convert
Convert.ToInt32(value: DateTime) : int
   (+0 other overloads)
Convert.ToInt32(value: string) : int
   (+0 other overloads)
Convert.ToInt32(value: decimal) : int
   (+0 other overloads)
Convert.ToInt32(value: float) : int
   (+0 other overloads)
Convert.ToInt32(value: float32) : int
   (+0 other overloads)
Convert.ToInt32(value: uint64) : int
   (+0 other overloads)
Convert.ToInt32(value: int64) : int
   (+0 other overloads)
Convert.ToInt32(value: int) : int
   (+0 other overloads)
Convert.ToInt32(value: uint32) : int
   (+0 other overloads)
Convert.ToInt32(value: uint16) : int
   (+0 other overloads)
val intToBool : i:int -> bool

Full name: FSharp.Converters.FunctionLibrary.intToBool
val i : int
val boolToVisibility : b:bool -> 'a

Full name: FSharp.Converters.FunctionLibrary.boolToVisibility
val b : bool
val convert : f:('T -> obj) -> obj:Object -> t:Type -> para:Object -> culture:Globalization.CultureInfo -> obj

Full name: FSharp.Converters.FunctionLibrary.convert
val f : ('T -> obj)
Multiple items
val obj : Object

--------------------
type obj = Object

Full name: Microsoft.FSharp.Core.obj
val t : Type
type Type =
  inherit MemberInfo
  member Assembly : Assembly
  member AssemblyQualifiedName : string
  member Attributes : TypeAttributes
  member BaseType : Type
  member ContainsGenericParameters : bool
  member DeclaringMethod : MethodBase
  member DeclaringType : Type
  member Equals : o:obj -> bool + 1 overload
  member FindInterfaces : filter:TypeFilter * filterCriteria:obj -> Type[]
  member FindMembers : memberType:MemberTypes * bindingAttr:BindingFlags * filter:MemberFilter * filterCriteria:obj -> MemberInfo[]
  ...

Full name: System.Type
val para : Object
val culture : Globalization.CultureInfo
namespace System.Globalization
Multiple items
type CultureInfo =
  new : name:string -> CultureInfo + 3 overloads
  member Calendar : Calendar
  member ClearCachedData : unit -> unit
  member Clone : unit -> obj
  member CompareInfo : CompareInfo
  member CultureTypes : CultureTypes
  member DateTimeFormat : DateTimeFormatInfo with get, set
  member DisplayName : string
  member EnglishName : string
  member Equals : value:obj -> bool
  ...

Full name: System.Globalization.CultureInfo

--------------------
Globalization.CultureInfo(name: string) : unit
Globalization.CultureInfo(culture: int) : unit
Globalization.CultureInfo(name: string, useUserOverride: bool) : unit
Globalization.CultureInfo(culture: int, useUserOverride: bool) : unit
val box : value:'T -> obj

Full name: Microsoft.FSharp.Core.Operators.box
Multiple items
type AbstractClassAttribute =
  inherit Attribute
  new : unit -> AbstractClassAttribute

Full name: Microsoft.FSharp.Core.AbstractClassAttribute

--------------------
new : unit -> AbstractClassAttribute
Multiple items
type ConverterBase =
  interface obj
  new : unit -> ConverterBase
  new : convertFunction:(obj -> Type -> obj -> CultureInfo -> obj) * convertBackFunction:(obj -> Type -> obj -> CultureInfo -> obj) -> ConverterBase
  abstract member Convert : (obj -> Type -> obj -> CultureInfo -> obj)
  abstract member ConvertBack : (obj -> Type -> obj -> CultureInfo -> obj)
  override Convert : value:'f * targetType:'g * parameter:'h * culture:'i -> 'j
  override ConvertBack : value:'a * targetType:'b * parameter:'c * culture:'d -> 'e
  override Convert : (obj -> Type -> obj -> CultureInfo -> obj)
  override ConvertBack : (obj -> Type -> obj -> CultureInfo -> obj)

Full name: FSharp.Converters.ConverterBase


 abstract class for converter


--------------------
new : unit -> ConverterBase


 constructor take nullFunction as inputs

new : convertFunction:(obj -> Type -> obj -> Globalization.CultureInfo -> obj) * convertBackFunction:(obj -> Type -> obj -> Globalization.CultureInfo -> obj) -> ConverterBase
val convertFunction : (obj -> Type -> obj -> Globalization.CultureInfo -> obj)
val convertBackFunction : (obj -> Type -> obj -> Globalization.CultureInfo -> obj)
val this : ConverterBase
Multiple items
override ConverterBase.Convert : value:'f * targetType:'g * parameter:'h * culture:'i -> 'j

Full name: FSharp.Converters.ConverterBase.Convert


 convert a value to new value


--------------------
type Convert =
  static val DBNull : obj
  static member ChangeType : value:obj * typeCode:TypeCode -> obj + 3 overloads
  static member FromBase64CharArray : inArray:char[] * offset:int * length:int -> byte[]
  static member FromBase64String : s:string -> byte[]
  static member GetTypeCode : value:obj -> TypeCode
  static member IsDBNull : value:obj -> bool
  static member ToBase64CharArray : inArray:byte[] * offsetIn:int * length:int * outArray:char[] * offsetOut:int -> int + 1 overload
  static member ToBase64String : inArray:byte[] -> string + 3 overloads
  static member ToBoolean : value:obj -> bool + 17 overloads
  static member ToByte : value:obj -> byte + 18 overloads
  ...

Full name: System.Convert
val value : 'f
val targetType : 'g
val parameter : 'h
val culture : 'i
Multiple items
property ConverterBase.Convert: obj -> Type -> obj -> Globalization.CultureInfo -> obj

--------------------
override ConverterBase.Convert : value:'f * targetType:'g * parameter:'h * culture:'i -> 'j


 convert a value to new value
override ConverterBase.ConvertBack : value:'a * targetType:'b * parameter:'c * culture:'d -> 'e

Full name: FSharp.Converters.ConverterBase.ConvertBack


 convert a value back
val targetType : 'b
val parameter : 'c
val culture : 'd
Multiple items
property ConverterBase.ConvertBack: obj -> Type -> obj -> Globalization.CultureInfo -> obj

--------------------
override ConverterBase.ConvertBack : value:'a * targetType:'b * parameter:'c * culture:'d -> 'e


 convert a value back
Multiple items
abstract member ConverterBase.Convert : (obj -> Type -> obj -> Globalization.CultureInfo -> obj)

Full name: FSharp.Converters.ConverterBase.Convert

--------------------
type Convert =
  static val DBNull : obj
  static member ChangeType : value:obj * typeCode:TypeCode -> obj + 3 overloads
  static member FromBase64CharArray : inArray:char[] * offset:int * length:int -> byte[]
  static member FromBase64String : s:string -> byte[]
  static member GetTypeCode : value:obj -> TypeCode
  static member IsDBNull : value:obj -> bool
  static member ToBase64CharArray : inArray:byte[] * offsetIn:int * length:int * outArray:char[] * offsetOut:int -> int + 1 overload
  static member ToBase64String : inArray:byte[] -> string + 3 overloads
  static member ToBoolean : value:obj -> bool + 17 overloads
  static member ToByte : value:obj -> byte + 18 overloads
  ...

Full name: System.Convert
type obj = Object

Full name: Microsoft.FSharp.Core.obj
Multiple items
override ConverterBase.Convert : (obj -> Type -> obj -> Globalization.CultureInfo -> obj)

Full name: FSharp.Converters.ConverterBase.Convert

--------------------
type Convert =
  static val DBNull : obj
  static member ChangeType : value:obj * typeCode:TypeCode -> obj + 3 overloads
  static member FromBase64CharArray : inArray:char[] * offset:int * length:int -> byte[]
  static member FromBase64String : s:string -> byte[]
  static member GetTypeCode : value:obj -> TypeCode
  static member IsDBNull : value:obj -> bool
  static member ToBase64CharArray : inArray:byte[] * offsetIn:int * length:int * outArray:char[] * offsetOut:int -> int + 1 overload
  static member ToBase64String : inArray:byte[] -> string + 3 overloads
  static member ToBoolean : value:obj -> bool + 17 overloads
  static member ToByte : value:obj -> byte + 18 overloads
  ...

Full name: System.Convert
abstract member ConverterBase.ConvertBack : (obj -> Type -> obj -> Globalization.CultureInfo -> obj)

Full name: FSharp.Converters.ConverterBase.ConvertBack
override ConverterBase.ConvertBack : (obj -> Type -> obj -> Globalization.CultureInfo -> obj)

Full name: FSharp.Converters.ConverterBase.ConvertBack
Multiple items
type StringToVisiblityConverter =
  inherit ConverterBase
  new : unit -> StringToVisiblityConverter

Full name: FSharp.Converters.StringToVisiblityConverter


 Sample concrete implementation


--------------------
new : unit -> StringToVisiblityConverter
Next Version Raw view Test code New version

More information

Link:http://fssnip.net/7Q
Posted:13 years ago
Author:Tao Liu
Tags: wpf , silverlight