diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index dcd6c870..30f1031b 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -1,3 +1,9 @@
+#### 4.0.0-beta-55
+* Add TwoWayT bindings for workflows that reuse bindings.
+* Add OneWayToSeqT bindings.
+* Add vopt and opt bindings for OneWayT, OneWayToSourceT, and TwoWayT bindings.
+* Add .NET 8 target and remove .NET Core 3.1 support
+
#### 4.0.0-beta-54
* Added the Readme file to the generated nuspec file so that it shows up on nuget.org.
* Added some debug logs to the performance logger at the top level.
diff --git a/src/Elmish.WPF/Binding.fs b/src/Elmish.WPF/Binding.fs
index ab30862e..c95c56d9 100644
--- a/src/Elmish.WPF/Binding.fs
+++ b/src/Elmish.WPF/Binding.fs
@@ -106,6 +106,36 @@ module Binding =
OneWay.id
|> createBindingT
+ /// Creates a one-way binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let opt x : Binding<'a option, 'msg, System.Nullable<'a>> =
+ x
+ |> id
+ |> mapModel Option.toNullable
+
+ /// Creates a one-way binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let vopt x : Binding<'a voption, 'msg, System.Nullable<'a>> =
+ x
+ |> id
+ |> mapModel ValueOption.toNullable
+
+ /// Creates a one-way binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let optobj<'a, 'msg when 'a : null> : string -> Binding<'a option, 'msg, 'a> =
+ id<'a, 'msg>
+ >> mapModel Option.toObj
+
+ /// Creates a one-way binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let voptobj<'a, 'msg when 'a : null> : string -> Binding<'a voption, 'msg, 'a> =
+ id<'a, 'msg>
+ >> mapModel ValueOption.toObj
+
///
/// Strongly-typed bindings that update the model from the view.
///
@@ -116,6 +146,36 @@ module Binding =
OneWayToSource.id
|> createBindingT
+ /// Creates a one-way-to-source binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let optobj<'a, 'model when 'a : null> : string -> Binding<'model, 'a option, 'a> =
+ id<'model, 'a>
+ >> mapMsg Option.ofObj
+
+ /// Creates a one-way-to-source binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let voptobj<'a, 'model when 'a : null> : string -> Binding<'model, 'a voption, 'a> =
+ id<'model, 'a>
+ >> mapMsg ValueOption.ofObj
+
+ /// Creates a one-way-to-source binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let opt x : Binding<'model, 'a option, System.Nullable<'a>> =
+ x
+ |> id
+ |> mapMsg Option.ofNullable
+
+ /// Creates a one-way-to-source binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let vopt x : Binding<'model, 'a voption, System.Nullable<'a>> =
+ x
+ |> id
+ |> mapMsg ValueOption.ofNullable
+
///
/// Strongly-typed bindings that update both ways
///
@@ -125,6 +185,40 @@ module Binding =
let id<'a> : string -> Binding<'a, 'a, 'a> =
TwoWay.id
|> createBindingT
+
+ /// Creates a two-way binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let opt x : Binding<'a option, 'a option, System.Nullable<'a>> =
+ x
+ |> id
+ |> mapMsg Option.ofNullable
+ |> mapModel Option.toNullable
+
+ /// Creates a two-way binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let vopt x : Binding<'a voption, 'a voption, System.Nullable<'a>> =
+ x
+ |> id
+ |> mapMsg ValueOption.ofNullable
+ |> mapModel ValueOption.toNullable
+
+ /// Creates a two-way binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let optobj<'a when 'a : null> : string -> Binding<'a option, 'a option, 'a> =
+ id<'a>
+ >> mapModel Option.toObj
+ >> mapMsg Option.ofObj
+
+ /// Creates a two-way binding to an optional value. The binding
+ /// automatically converts between a missing value in the model and
+ /// a null value in the view.
+ let voptobj<'a when 'a : null> : string -> Binding<'a voption, 'a voption, 'a> =
+ id<'a>
+ >> mapMsg ValueOption.ofObj
+ >> mapModel ValueOption.toObj
///
/// The strongly-typed counterpart of Binding.oneWaySeq with parameter getId.
@@ -265,7 +359,7 @@ module Binding =
TwoWay.id
|> createBinding
- /// Creates a one-way-to-source binding to an optional value. The binding
+ /// Creates a two-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a null value in the view.
let vopt<'a> : string -> Binding<'a voption, 'a voption> =
@@ -273,7 +367,7 @@ module Binding =
>> mapModel ValueOption.box
>> mapMsg ValueOption.unbox
- /// Creates a one-way-to-source binding to an optional value. The binding
+ /// Creates a two-way binding to an optional value. The binding
/// automatically converts between a missing value in the model and
/// a null value in the view.
let opt<'a> : string -> Binding<'a option, 'a option> =
diff --git a/src/Elmish.WPF/Elmish.WPF.fsproj b/src/Elmish.WPF/Elmish.WPF.fsproj
index 9146b267..371935dc 100644
--- a/src/Elmish.WPF/Elmish.WPF.fsproj
+++ b/src/Elmish.WPF/Elmish.WPF.fsproj
@@ -18,7 +18,7 @@
https://github.com/elmish/Elmish.WPF
WPF F# fsharp Elmish Elm
elmish-wpf-logo-128x128.png
- 4.0.0-beta-54
+ 4.0.0-beta-55
https://github.com/elmish/Elmish.WPF/blob/master/RELEASE_NOTES.md
README.md