67 people like it.
Like the snippet!
ObservableObject
The ObservableObject type implements the INotifyPropertyChanged interface used in WPF and Silverlight to notify on changes to properties that are bound to a control. Specify property names type safely using F# Quotations, i.e. <@ this.PropertyName @> when invoking the NotifyPropertyChanged method. If you are following the MVVM pattern then your View Model class can inherit from the ObservableObject type.
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:
46:
47:
48:
|
#if INTERACTIVE
#r "PresentationCore.dll"
#r "PresentationFramework.dll"
#r "WindowsBase.dll"
#endif
open System.ComponentModel
open Microsoft.FSharp.Quotations.Patterns
type ObservableObject () =
let propertyChanged = DelegateEvent<PropertyChangedEventHandler>()
let getPropertyName = function
| PropertyGet(_,pi,_) -> pi.Name
| _ -> invalidOp "Expecting property getter expression"
interface INotifyPropertyChanged with
[<CLIEvent>]
member this.PropertyChanged = propertyChanged.Publish
member this.NotifyPropertyChanged propertyName =
propertyChanged.Trigger [|this; PropertyChangedEventArgs propertyName|]
member this.NotifyPropertyChanged quotation =
quotation |> getPropertyName |> this.NotifyPropertyChanged
type MessageViewModel () =
inherit ObservableObject()
let mutable text = ""
member this.Message
with get () = text
and set value =
text <- value
this.NotifyPropertyChanged <@ this.Message @>
open System.Windows
open System.Windows.Controls
open System.Windows.Markup
let xaml =
@"<Window xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
<TextBlock Text='{Binding Message}'/>
</Window>"
let view = XamlReader.Parse(xaml) :?> Window
do view.DataContext <- MessageViewModel(Message="Hello World")
#if INTERACTIVE
do view.Show() |> ignore
#else
[<System.STAThread>]
do (Application()).Run(view) |> ignore
#endif
|
namespace System
namespace System.ComponentModel
namespace Microsoft
namespace Microsoft.FSharp
namespace Microsoft.FSharp.Quotations
module Patterns
from Microsoft.FSharp.Quotations
Multiple items
type ObservableObject =
interface INotifyPropertyChanged
new : unit -> ObservableObject
member NotifyPropertyChanged : propertyName:string -> unit
member NotifyPropertyChanged : quotation:Expr -> unit
Full name: Script.ObservableObject
--------------------
new : unit -> ObservableObject
val propertyChanged : DelegateEvent<PropertyChangedEventHandler>
Multiple items
type DelegateEvent<'Delegate (requires 'Delegate :> Delegate)> =
new : unit -> DelegateEvent<'Delegate>
member Trigger : args:obj [] -> unit
member Publish : IDelegateEvent<'Delegate>
Full name: Microsoft.FSharp.Control.DelegateEvent<_>
--------------------
new : unit -> DelegateEvent<'Delegate>
type PropertyChangedEventHandler =
delegate of obj * PropertyChangedEventArgs -> unit
Full name: System.ComponentModel.PropertyChangedEventHandler
val getPropertyName : (Quotations.Expr -> string)
active recognizer PropertyGet: Quotations.Expr -> (Quotations.Expr option * System.Reflection.PropertyInfo * Quotations.Expr list) option
Full name: Microsoft.FSharp.Quotations.Patterns.( |PropertyGet|_| )
val pi : System.Reflection.PropertyInfo
property System.Reflection.MemberInfo.Name: string
val invalidOp : message:string -> 'T
Full name: Microsoft.FSharp.Core.Operators.invalidOp
type INotifyPropertyChanged =
event PropertyChanged : PropertyChangedEventHandler
Full name: System.ComponentModel.INotifyPropertyChanged
Multiple items
type CLIEventAttribute =
inherit Attribute
new : unit -> CLIEventAttribute
Full name: Microsoft.FSharp.Core.CLIEventAttribute
--------------------
new : unit -> CLIEventAttribute
val this : ObservableObject
override ObservableObject.PropertyChanged : IDelegateEvent<PropertyChangedEventHandler>
Full name: Script.ObservableObject.PropertyChanged
property DelegateEvent.Publish: IDelegateEvent<PropertyChangedEventHandler>
member ObservableObject.NotifyPropertyChanged : propertyName:string -> unit
Full name: Script.ObservableObject.NotifyPropertyChanged
val propertyName : string
member DelegateEvent.Trigger : args:obj [] -> unit
Multiple items
type PropertyChangedEventArgs =
inherit EventArgs
new : propertyName:string -> PropertyChangedEventArgs
member PropertyName : string
Full name: System.ComponentModel.PropertyChangedEventArgs
--------------------
PropertyChangedEventArgs(propertyName: string) : unit
member ObservableObject.NotifyPropertyChanged : quotation:Quotations.Expr -> unit
Full name: Script.ObservableObject.NotifyPropertyChanged
val quotation : Quotations.Expr
member ObservableObject.NotifyPropertyChanged : propertyName:string -> unit
member ObservableObject.NotifyPropertyChanged : quotation:Quotations.Expr -> unit
Multiple items
type MessageViewModel =
inherit ObservableObject
new : unit -> MessageViewModel
member Message : string
member Message : string with set
Full name: Script.MessageViewModel
--------------------
new : unit -> MessageViewModel
val mutable text : string
val this : MessageViewModel
member MessageViewModel.Message : string with set
Full name: Script.MessageViewModel.Message
val set : elements:seq<'T> -> Set<'T> (requires comparison)
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.set
val value : string
property MessageViewModel.Message: string
namespace System.Windows
namespace System.Windows.Controls
namespace System.Windows.Markup
val xaml : string
Full name: Script.xaml
val view : Window
Full name: Script.view
Multiple items
type XamlReader =
new : unit -> XamlReader
member CancelAsync : unit -> unit
member LoadAsync : stream:Stream -> obj + 2 overloads
event LoadCompleted : AsyncCompletedEventHandler
static member GetWpfSchemaContext : unit -> XamlSchemaContext
static member Load : stream:Stream -> obj + 3 overloads
static member Parse : xamlText:string -> obj + 1 overload
Full name: System.Windows.Markup.XamlReader
--------------------
XamlReader() : unit
XamlReader.Parse(xamlText: string) : obj
XamlReader.Parse(xamlText: string, parserContext: ParserContext) : obj
Multiple items
type Window =
inherit ContentControl
new : unit -> Window
member Activate : unit -> bool
member AllowsTransparency : bool with get, set
member Close : unit -> unit
member DialogResult : Nullable<bool> with get, set
member DragMove : unit -> unit
member Hide : unit -> unit
member Icon : ImageSource with get, set
member IsActive : bool
member Left : float with get, set
...
Full name: System.Windows.Window
--------------------
Window() : unit
property FrameworkElement.DataContext: obj
Multiple items
type STAThreadAttribute =
inherit Attribute
new : unit -> STAThreadAttribute
Full name: System.STAThreadAttribute
--------------------
System.STAThreadAttribute() : unit
Multiple items
active recognizer Application: Quotations.Expr -> (Quotations.Expr * Quotations.Expr) option
Full name: Microsoft.FSharp.Quotations.Patterns.( |Application|_| )
--------------------
type Application =
inherit DispatcherObject
new : unit -> Application
member FindResource : resourceKey:obj -> obj
member MainWindow : Window with get, set
member Properties : IDictionary
member Resources : ResourceDictionary with get, set
member Run : unit -> int + 1 overload
member Shutdown : unit -> unit + 1 overload
member ShutdownMode : ShutdownMode with get, set
member StartupUri : Uri with get, set
member TryFindResource : resourceKey:obj -> obj
...
Full name: System.Windows.Application
--------------------
Application() : unit
val ignore : value:'T -> unit
Full name: Microsoft.FSharp.Core.Operators.ignore
More information