From 73e6e550a672f75f212763f2948a12c461a5fc90 Mon Sep 17 00:00:00 2001 From: Thomas Peterson Date: Wed, 13 Nov 2024 10:30:54 +0100 Subject: [PATCH] Fixes --- .idea/.idea.PSCHelpdesk/.idea/.name | 1 - .idea/.idea.PSCHelpdesk/.idea/workspace.xml | 175 +- HetznerServer/Views/ServerView.axaml | 5 + Nextcloud/Views/NotesView.axaml | 7 +- .../PSCHelpdesk.Desktop.csproj | 27 +- _dist/hetzner/Avalonia.Base.dll | Bin _dist/hetzner/Avalonia.Controls.dll | Bin _dist/hetzner/Avalonia.DesignerSupport.dll | Bin _dist/hetzner/Avalonia.Dialogs.dll | Bin _dist/hetzner/Avalonia.Markup.Xaml.dll | Bin _dist/hetzner/Avalonia.Markup.dll | Bin _dist/hetzner/Avalonia.Metal.dll | Bin _dist/hetzner/Avalonia.MicroCom.dll | Bin _dist/hetzner/Avalonia.OpenGL.dll | Bin _dist/hetzner/Avalonia.ReactiveUI.dll | Bin _dist/hetzner/Avalonia.Remote.Protocol.dll | Bin _dist/hetzner/Avalonia.Vulkan.dll | Bin .../Avalonia.Xaml.Interactions.Custom.dll | Bin ...Avalonia.Xaml.Interactions.DragAndDrop.dll | Bin .../Avalonia.Xaml.Interactions.Draggable.dll | Bin .../Avalonia.Xaml.Interactions.Events.dll | Bin .../Avalonia.Xaml.Interactions.Responsive.dll | Bin _dist/hetzner/Avalonia.Xaml.Interactions.dll | Bin _dist/hetzner/Avalonia.Xaml.Interactivity.dll | Bin _dist/hetzner/Avalonia.dll | Bin _dist/hetzner/DynamicData.dll | Bin _dist/hetzner/HetznerCloudApi.dll | Bin _dist/hetzner/HetznerServer.dll | Bin 51712 -> 52224 bytes _dist/hetzner/HetznerServer.pdb | Bin 22260 -> 22236 bytes _dist/hetzner/MicroCom.Runtime.dll | Bin ...sions.DependencyInjection.Abstractions.dll | Bin ...crosoft.Extensions.DependencyInjection.dll | Bin _dist/hetzner/Newtonsoft.Json.dll | Bin _dist/hetzner/ReactiveUI.dll | Bin _dist/hetzner/Renci.SshNet.dll | Bin _dist/hetzner/Splat.dll | Bin _dist/hetzner/System.Reactive.dll | Bin _dist/nextcloud/Avalonia.Base.dll | Bin _dist/nextcloud/Avalonia.Controls.dll | Bin _dist/nextcloud/Avalonia.DesignerSupport.dll | Bin _dist/nextcloud/Avalonia.Dialogs.dll | Bin _dist/nextcloud/Avalonia.Markup.Xaml.dll | Bin _dist/nextcloud/Avalonia.Markup.dll | Bin _dist/nextcloud/Avalonia.Metal.dll | Bin _dist/nextcloud/Avalonia.MicroCom.dll | Bin _dist/nextcloud/Avalonia.OpenGL.dll | Bin _dist/nextcloud/Avalonia.ReactiveUI.dll | Bin _dist/nextcloud/Avalonia.Remote.Protocol.dll | Bin _dist/nextcloud/Avalonia.Svg.dll | Bin _dist/nextcloud/Avalonia.Vulkan.dll | Bin .../Avalonia.Xaml.Interactions.Custom.dll | Bin ...Avalonia.Xaml.Interactions.DragAndDrop.dll | Bin .../Avalonia.Xaml.Interactions.Draggable.dll | Bin .../Avalonia.Xaml.Interactions.Events.dll | Bin .../Avalonia.Xaml.Interactions.Responsive.dll | Bin .../nextcloud/Avalonia.Xaml.Interactions.dll | Bin .../nextcloud/Avalonia.Xaml.Interactivity.dll | Bin _dist/nextcloud/Avalonia.dll | Bin _dist/nextcloud/AvaloniaEdit.dll | Bin _dist/nextcloud/ColorTextBlock.Avalonia.dll | Bin _dist/nextcloud/CommunityToolkit.Mvvm.dll | Bin _dist/nextcloud/CommunityToolkit.Mvvm.pdb | Bin _dist/nextcloud/CommunityToolkit.Mvvm.xml | 8980 ++++++++--------- _dist/nextcloud/DynamicData.dll | Bin _dist/nextcloud/ExCSS.dll | Bin _dist/nextcloud/Fizzler.dll | Bin _dist/nextcloud/HtmlAgilityPack.dll | Bin _dist/nextcloud/Markdown.Avalonia.Full.dll | Bin _dist/nextcloud/Markdown.Avalonia.Html.dll | Bin _dist/nextcloud/Markdown.Avalonia.Svg.dll | Bin .../Markdown.Avalonia.SyntaxHigh.dll | Bin _dist/nextcloud/Markdown.Avalonia.dll | Bin _dist/nextcloud/MicroCom.Runtime.dll | Bin _dist/nextcloud/Newtonsoft.Json.dll | Bin _dist/nextcloud/Nextcloud.dll | Bin 37376 -> 37888 bytes _dist/nextcloud/Nextcloud.pdb | Bin 19536 -> 19532 bytes _dist/nextcloud/ReactiveUI.dll | Bin _dist/nextcloud/RestSharp.dll | Bin _dist/nextcloud/ShimSkiaSharp.dll | Bin _dist/nextcloud/Splat.dll | Bin _dist/nextcloud/Svg.Custom.dll | Bin _dist/nextcloud/Svg.Model.dll | Bin _dist/nextcloud/System.Reactive.dll | Bin 83 files changed, 4633 insertions(+), 4562 deletions(-) delete mode 100644 .idea/.idea.PSCHelpdesk/.idea/.name mode change 100644 => 100755 _dist/hetzner/Avalonia.Base.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Controls.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.DesignerSupport.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Dialogs.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Markup.Xaml.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Markup.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Metal.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.MicroCom.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.OpenGL.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.ReactiveUI.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Remote.Protocol.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Vulkan.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Xaml.Interactions.Custom.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Xaml.Interactions.DragAndDrop.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Xaml.Interactions.Draggable.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Xaml.Interactions.Events.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Xaml.Interactions.Responsive.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Xaml.Interactions.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.Xaml.Interactivity.dll mode change 100644 => 100755 _dist/hetzner/Avalonia.dll mode change 100644 => 100755 _dist/hetzner/DynamicData.dll mode change 100644 => 100755 _dist/hetzner/HetznerCloudApi.dll mode change 100644 => 100755 _dist/hetzner/MicroCom.Runtime.dll mode change 100644 => 100755 _dist/hetzner/Microsoft.Extensions.DependencyInjection.Abstractions.dll mode change 100644 => 100755 _dist/hetzner/Microsoft.Extensions.DependencyInjection.dll mode change 100644 => 100755 _dist/hetzner/Newtonsoft.Json.dll mode change 100644 => 100755 _dist/hetzner/ReactiveUI.dll mode change 100644 => 100755 _dist/hetzner/Renci.SshNet.dll mode change 100644 => 100755 _dist/hetzner/Splat.dll mode change 100644 => 100755 _dist/hetzner/System.Reactive.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Base.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Controls.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.DesignerSupport.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Dialogs.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Markup.Xaml.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Markup.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Metal.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.MicroCom.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.OpenGL.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.ReactiveUI.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Remote.Protocol.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Svg.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Vulkan.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Xaml.Interactions.Custom.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Xaml.Interactions.DragAndDrop.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Xaml.Interactions.Draggable.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Xaml.Interactions.Events.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Xaml.Interactions.Responsive.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Xaml.Interactions.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.Xaml.Interactivity.dll mode change 100644 => 100755 _dist/nextcloud/Avalonia.dll mode change 100644 => 100755 _dist/nextcloud/AvaloniaEdit.dll mode change 100644 => 100755 _dist/nextcloud/ColorTextBlock.Avalonia.dll mode change 100644 => 100755 _dist/nextcloud/CommunityToolkit.Mvvm.dll mode change 100644 => 100755 _dist/nextcloud/CommunityToolkit.Mvvm.pdb mode change 100644 => 100755 _dist/nextcloud/CommunityToolkit.Mvvm.xml mode change 100644 => 100755 _dist/nextcloud/DynamicData.dll mode change 100644 => 100755 _dist/nextcloud/ExCSS.dll mode change 100644 => 100755 _dist/nextcloud/Fizzler.dll mode change 100644 => 100755 _dist/nextcloud/HtmlAgilityPack.dll mode change 100644 => 100755 _dist/nextcloud/Markdown.Avalonia.Full.dll mode change 100644 => 100755 _dist/nextcloud/Markdown.Avalonia.Html.dll mode change 100644 => 100755 _dist/nextcloud/Markdown.Avalonia.Svg.dll mode change 100644 => 100755 _dist/nextcloud/Markdown.Avalonia.SyntaxHigh.dll mode change 100644 => 100755 _dist/nextcloud/Markdown.Avalonia.dll mode change 100644 => 100755 _dist/nextcloud/MicroCom.Runtime.dll mode change 100644 => 100755 _dist/nextcloud/Newtonsoft.Json.dll mode change 100644 => 100755 _dist/nextcloud/ReactiveUI.dll mode change 100644 => 100755 _dist/nextcloud/RestSharp.dll mode change 100644 => 100755 _dist/nextcloud/ShimSkiaSharp.dll mode change 100644 => 100755 _dist/nextcloud/Splat.dll mode change 100644 => 100755 _dist/nextcloud/Svg.Custom.dll mode change 100644 => 100755 _dist/nextcloud/Svg.Model.dll mode change 100644 => 100755 _dist/nextcloud/System.Reactive.dll diff --git a/.idea/.idea.PSCHelpdesk/.idea/.name b/.idea/.idea.PSCHelpdesk/.idea/.name deleted file mode 100644 index 6f7d947..0000000 --- a/.idea/.idea.PSCHelpdesk/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -PSCHelpdesk \ No newline at end of file diff --git a/.idea/.idea.PSCHelpdesk/.idea/workspace.xml b/.idea/.idea.PSCHelpdesk/.idea/workspace.xml index 5d5768f..a5a2607 100644 --- a/.idea/.idea.PSCHelpdesk/.idea/workspace.xml +++ b/.idea/.idea.PSCHelpdesk/.idea/workspace.xml @@ -11,24 +11,87 @@ - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - { - "keyToString": { - ".NET Project.PSCHelpdesk.Desktop ohne plugin.executor": "Run", - ".NET Project.PSCHelpdesk.Desktop.executor": "Debug", - "Publish to folder.Build HetznerServer Plugin Debug.executor": "Run", - "Publish to folder.Copy Hetzner Target.executor": "Run", - "Publish to folder.Copy NextCloud Target.executor": "Run", - "Publish to folder.Publish HetznerServer to folder.executor": "Run", - "Publish to folder.Publish NextCloud to folder.executor": "Run", - "Publish to folder.Publish Nextcloud to folder.executor": "Run", - "RunOnceActivity.ShowReadmeOnStart": "true", - "XThreadsFramesViewSplitterKey": "0.4427131", - "git-widget-placeholder": "master", - "ignore.virus.scanning.warn.message": "true", - "last_opened_file_path": "/home/thomas/RiderProjects/PSCHelpdesk/PSCHelpdesk/PSCHelpdesk.Desktop/bin/Debug/net9.0/plugins", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "settings.editor.selected.configurable": "SolutionBuilderGeneralOptionsPage", - "vue.rearranger.settings.migration": "true" + +}]]> @@ -258,6 +321,7 @@ + @@ -286,14 +350,7 @@ file://$PROJECT_DIR$/HetznerServer/Menu/MainMenu.cs 13 - - - - - - + @@ -361,24 +418,6 @@ - - file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/dd582eafcc7da4dc5ece1e7e4de37b1f271b42b4cea54a2aecfe3bda3fd2e5a/HyperlinkButton.cs - 80 - - - - file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/dd582eafcc7da4dc5ece1e7e4de37b1f271b42b4cea54a2aecfe3bda3fd2e5a/HyperlinkButton.cs - 78 - - - - file://$APPLICATION_CONFIG_DIR$/resharper-host/SourcesCache/dd582eafcc7da4dc5ece1e7e4de37b1f271b42b4cea54a2aecfe3bda3fd2e5a/HyperlinkButton.cs - 60 - - file://$PROJECT_DIR$/HetznerServer/Views/ServerView.axaml.cs 29 diff --git a/HetznerServer/Views/ServerView.axaml b/HetznerServer/Views/ServerView.axaml index 0183ba8..b1579fd 100644 --- a/HetznerServer/Views/ServerView.axaml +++ b/HetznerServer/Views/ServerView.axaml @@ -92,6 +92,11 @@ + + + diff --git a/Nextcloud/Views/NotesView.axaml b/Nextcloud/Views/NotesView.axaml index 0457ef0..52d9e0f 100644 --- a/Nextcloud/Views/NotesView.axaml +++ b/Nextcloud/Views/NotesView.axaml @@ -14,7 +14,12 @@ DisplayMode="Inline" OpenPaneLength="300"> - + + + + diff --git a/PSCHelpdesk/PSCHelpdesk.Desktop/PSCHelpdesk.Desktop.csproj b/PSCHelpdesk/PSCHelpdesk.Desktop/PSCHelpdesk.Desktop.csproj index bef86cc..116b071 100644 --- a/PSCHelpdesk/PSCHelpdesk.Desktop/PSCHelpdesk.Desktop.csproj +++ b/PSCHelpdesk/PSCHelpdesk.Desktop/PSCHelpdesk.Desktop.csproj @@ -6,6 +6,7 @@ net9.0 enable true + Always @@ -28,7 +29,29 @@ - - + + + + + + + + diff --git a/_dist/hetzner/Avalonia.Base.dll b/_dist/hetzner/Avalonia.Base.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Controls.dll b/_dist/hetzner/Avalonia.Controls.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.DesignerSupport.dll b/_dist/hetzner/Avalonia.DesignerSupport.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Dialogs.dll b/_dist/hetzner/Avalonia.Dialogs.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Markup.Xaml.dll b/_dist/hetzner/Avalonia.Markup.Xaml.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Markup.dll b/_dist/hetzner/Avalonia.Markup.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Metal.dll b/_dist/hetzner/Avalonia.Metal.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.MicroCom.dll b/_dist/hetzner/Avalonia.MicroCom.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.OpenGL.dll b/_dist/hetzner/Avalonia.OpenGL.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.ReactiveUI.dll b/_dist/hetzner/Avalonia.ReactiveUI.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Remote.Protocol.dll b/_dist/hetzner/Avalonia.Remote.Protocol.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Vulkan.dll b/_dist/hetzner/Avalonia.Vulkan.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Xaml.Interactions.Custom.dll b/_dist/hetzner/Avalonia.Xaml.Interactions.Custom.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Xaml.Interactions.DragAndDrop.dll b/_dist/hetzner/Avalonia.Xaml.Interactions.DragAndDrop.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Xaml.Interactions.Draggable.dll b/_dist/hetzner/Avalonia.Xaml.Interactions.Draggable.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Xaml.Interactions.Events.dll b/_dist/hetzner/Avalonia.Xaml.Interactions.Events.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Xaml.Interactions.Responsive.dll b/_dist/hetzner/Avalonia.Xaml.Interactions.Responsive.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Xaml.Interactions.dll b/_dist/hetzner/Avalonia.Xaml.Interactions.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.Xaml.Interactivity.dll b/_dist/hetzner/Avalonia.Xaml.Interactivity.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Avalonia.dll b/_dist/hetzner/Avalonia.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/DynamicData.dll b/_dist/hetzner/DynamicData.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/HetznerCloudApi.dll b/_dist/hetzner/HetznerCloudApi.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/HetznerServer.dll b/_dist/hetzner/HetznerServer.dll index aba62a7ec1372dd25ec1a0744e65a7ceefa7bf1c..166d6783bfdcb0f8d81ed8c3c26dfa7024b9589e 100644 GIT binary patch delta 17152 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≪^`G#2Pn|xh9TOA+8ll^1a2%1^-Q`tJ1 zAlGSwH1HmvF+>Ix{{N7a-Z*+ za?iGjH~v0w*zfRrw_Un*x*89Xw|gr7LfG5g%>NhbK_Nic^)zqS29eTrg%oscO~_jk zr#8(Yyj^P(%mN!syU}R5HHdUlx>vD0rTfB!dWjYD62`WKw9^8mJ)v4_r??r|V+Qng zuhoJg;9Zii=(7a zpOn73cA!c3PHD%!cFDYq7k322E5?Bx>!!b=>fTgESFCzkO80w0@mTS)T~gi*Z})zg z$pLTor!tezok0P2Ukb(B^*L(AlpUF{y^o{^qyM4w4EXV8Sb_wZEbRWoX|Hkcp*nHc zD0z6Qup1XYTo_MNygivIJvlPvo-jTVCVnfvURZ+?jJ^Sa&jJaMvc;Di?nP$61Zx@R(S_TctXL;!ais zi`!%a43D>|$%67UNs}fyMm?E4&^-&RWbt?cfdHn9w`YmRW3dWv9XF}NbXPnnJ!$LSbfAqU`lX^wI3218a{Aj27PGD3%CfVn`!S9$zjB3d+%QG<@q+dF%zI00?0X zV%)}in|SUghR&jUd%79cGF-v1exSAv{3~GY8jqw;XpUiMe1#nP^@(ov=_FEmZg3}-4fKH5* zsc|Pz?ZnQF+|e6{w~3S6gg08KKB_5~anDvs?~wRtQnI2P8;e}x22aB2SS0A}>5uci zfpb8nz0!xZFB>}NQ@@M#j{i>eh!7jy{j;zP$(0A`Q_bpGz>XJh> z1*!IYDQwIriL^a1J2rGv5*x@WB+biw6@n)uyoIrZ(}~-#se5v~J%{W;Rd|^CCNYtC zD?@@Fo9sFQ@mTPQ`}L$Ju@I0g6EbZmJj@4`9FHfZm-~a-P3JM_#T_k{M{kPo_NJjh zg3w9z4E1Q-fCmpQ&sVu-rixD&Nl?4Y>YJS9V3^;PTVCxgSPk|6B(IW z0s(I^t}#0-Rz(Tmf~EwlR+U`@FcQ7>+@tP33yA>yDL^h}y&})O<8e+6T7<`xp|j(i zka>#{4vmc^zs)LMB?8FN+kFTvySgwOSj}8#9;JXR*f|ngj0f;4V}S@rWiJz`es8n4 zcdFDkt5#vdLPTrqIsu#9gV+VOpWbsMwlH>mE>-M63Y$@A4&}h$^C;nhoCyD(89u}Y zV0ao9GQsKgPPLJWRfRnf|H1=pJX`}F6qI|p(fRZV@l^`?jWFKcPA=7jysP$hdOXQi z#Odumre(81EZMmh)z?fcrSu!ojXlL~pm|G)DAK5Pim){?(D{w)rD# zM%GkUj~r1oqP1<_u)2|Tt!=F>weyFy4y|cx8&-E-OY4Z?=NWm=jE%S0f)|sRI-T!I zSK(;dkK8ZwtOSS8Ve<_fO?id_SQ1_}4Qv@~Fm_)sZv; z-(E*hD>Uac G>;DC+RmPG4 delta 16996 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 Ub1g(YgbM`v^ZQCr893|z06)7XdH?_b diff --git a/_dist/hetzner/MicroCom.Runtime.dll b/_dist/hetzner/MicroCom.Runtime.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Microsoft.Extensions.DependencyInjection.Abstractions.dll b/_dist/hetzner/Microsoft.Extensions.DependencyInjection.Abstractions.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Microsoft.Extensions.DependencyInjection.dll b/_dist/hetzner/Microsoft.Extensions.DependencyInjection.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Newtonsoft.Json.dll b/_dist/hetzner/Newtonsoft.Json.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/ReactiveUI.dll b/_dist/hetzner/ReactiveUI.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Renci.SshNet.dll b/_dist/hetzner/Renci.SshNet.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/Splat.dll b/_dist/hetzner/Splat.dll old mode 100644 new mode 100755 diff --git a/_dist/hetzner/System.Reactive.dll b/_dist/hetzner/System.Reactive.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Base.dll b/_dist/nextcloud/Avalonia.Base.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Controls.dll b/_dist/nextcloud/Avalonia.Controls.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.DesignerSupport.dll b/_dist/nextcloud/Avalonia.DesignerSupport.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Dialogs.dll b/_dist/nextcloud/Avalonia.Dialogs.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Markup.Xaml.dll b/_dist/nextcloud/Avalonia.Markup.Xaml.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Markup.dll b/_dist/nextcloud/Avalonia.Markup.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Metal.dll b/_dist/nextcloud/Avalonia.Metal.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.MicroCom.dll b/_dist/nextcloud/Avalonia.MicroCom.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.OpenGL.dll b/_dist/nextcloud/Avalonia.OpenGL.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.ReactiveUI.dll b/_dist/nextcloud/Avalonia.ReactiveUI.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Remote.Protocol.dll b/_dist/nextcloud/Avalonia.Remote.Protocol.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Svg.dll b/_dist/nextcloud/Avalonia.Svg.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Vulkan.dll b/_dist/nextcloud/Avalonia.Vulkan.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Xaml.Interactions.Custom.dll b/_dist/nextcloud/Avalonia.Xaml.Interactions.Custom.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Xaml.Interactions.DragAndDrop.dll b/_dist/nextcloud/Avalonia.Xaml.Interactions.DragAndDrop.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Xaml.Interactions.Draggable.dll b/_dist/nextcloud/Avalonia.Xaml.Interactions.Draggable.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Xaml.Interactions.Events.dll b/_dist/nextcloud/Avalonia.Xaml.Interactions.Events.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Xaml.Interactions.Responsive.dll b/_dist/nextcloud/Avalonia.Xaml.Interactions.Responsive.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Xaml.Interactions.dll b/_dist/nextcloud/Avalonia.Xaml.Interactions.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.Xaml.Interactivity.dll b/_dist/nextcloud/Avalonia.Xaml.Interactivity.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Avalonia.dll b/_dist/nextcloud/Avalonia.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/AvaloniaEdit.dll b/_dist/nextcloud/AvaloniaEdit.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/ColorTextBlock.Avalonia.dll b/_dist/nextcloud/ColorTextBlock.Avalonia.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/CommunityToolkit.Mvvm.dll b/_dist/nextcloud/CommunityToolkit.Mvvm.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/CommunityToolkit.Mvvm.pdb b/_dist/nextcloud/CommunityToolkit.Mvvm.pdb old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/CommunityToolkit.Mvvm.xml b/_dist/nextcloud/CommunityToolkit.Mvvm.xml old mode 100644 new mode 100755 index be75f03..63cfd9d --- a/_dist/nextcloud/CommunityToolkit.Mvvm.xml +++ b/_dist/nextcloud/CommunityToolkit.Mvvm.xml @@ -1,4490 +1,4490 @@ - - - - CommunityToolkit.Mvvm - - - - - A helper type for the type. - - - - - The cached for - - - - - An interface for a grouped collection of items. - - - - - Gets the key for the current collection. - - - - - Gets the number of items currently in the grouped collection. - - - - - Gets the element at the specified index in the current collection. - - The zero-based index of the element to get. - The element at the specified index in the read-only list. - Thrown if the index is out of range. - - - - An interface for a grouped collection of items. - - The type of the group key. - The type of elements in the group. - - - - Gets the element at the specified index in the current collection. - - The zero-based index of the element to get. - The element at the specified index in the read-only list. - Thrown if the index is out of range. - - - - An interface for a grouped collection of items. - - The type of the group key. - - - - Gets the key for the current collection. - - - - - The extensions methods to simplify the usage of . - - - - - Returns the first group with key. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to query. - The first group matching . - Thrown if or are . - The target group does not exist. - - - - Returns the first group with key or if not found. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to query. - The first group matching or . - Thrown if or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to add. - The added . - Thrown if or are . - - - - Adds a key-collection item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The group of items to add. - The added . - Thrown if or are . - - - - Adds a key-collection item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where will be added. - The collection to add. - The added . - Thrown if , or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to add. - The added . - Thrown if or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The group of items to add. - The added . - Thrown if or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where will be added. - The collection to add. - The added . - Thrown if , or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to add. - The instance to insert at the right position. - The added . - Thrown if , or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The group of items to add. - The instance to insert at the right position. - The added . - Thrown if , or are . - - - - Adds a key-value item into a target . - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where will be added. - The instance to insert at the right position. - The collection to add. - The added . - Thrown if , , or are . - - - - Add into the first group with key. - If the group does not exist, it will be added. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where the should be added. - The item to add. - The instance of the which will receive the value. It will either be an existing group or a new group. - Thrown if or are . - - - - Insert into the first group with key. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where to insert . - The item to add. - The instance of the which will receive the value. - Thrown if or are . - - - - Insert into the first group with key. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where to insert . - The instance to compare keys. - The item to add. - The instance to compare elements. - The instance of the which will receive the value. - Thrown if , , or are . - - - - Remove the first occurrence of the group with from the grouped collection. - It will not do anything if the group does not exist. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group to remove. - Thrown if or are . - - - - Remove the first from the first group with from the grouped collection. - It will not do anything if the group or the item does not exist. - - The type of the group key. - The type of the items in the collection. - The source instance. - The key of the group where the should be removed. - The item to remove. - If true (default value), the group will be removed once it becomes empty. - Thrown if or are . - - - - An observable list of observable groups. - - The type of the group keys. - The type of elements in the collection. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The initial data to add in the grouped collection. - Thrown if is . - - - - - - - Tries to get the underlying instance, if present. - - The resulting , if one was in use. - Whether or not a instance has been found. - - - - - - - - - - An observable group. - It associates a to an . - - The type of the group key. - The type of elements in the group. - - - - Initializes a new instance of the class. - - The key for the group. - Thrown if is . - - - - Initializes a new instance of the class. - - The grouping to fill the group. - Thrown if is . - - - - Initializes a new instance of the class. - - The key for the group. - The initial collection of data to add to the group. - Thrown if or are . - - - - Gets or sets the key of the group. - - Thrown if is . - - - - Tries to get the underlying instance, if present. - - The resulting , if one was in use. - Whether or not a instance has been found. - - - - - - - - - - A read-only list of groups. - - The type of the group keys. - The type of elements in the collection. - - - - Initializes a new instance of the class. - - The source collection to wrap. - Thrown if is . - - - - Initializes a new instance of the class. - - The source collection to wrap. - Thrown if is . - - - - - - - - - - - - - Forwards the event whenever it is raised by the wrapped collection. - - The wrapped collection (an of instance). - The arguments. - Thrown if a range operation is requested. - - - - Returns the first group with key or if not found. - - The key of the group to query (assumed not to be ). - The first group matching . - - - - A read-only observable group. It associates a to a . - - The type of the group key. - The type of elements in the group. - - - - Initializes a new instance of the class. - - The key of the group. - The collection of items to add in the group. - Thrown if or are . - - - - Initializes a new instance of the class. - - The to wrap. - Thrown if is . - - - - - - - - - - - - - An attribute that indicates that a given type should implement the interface and - have minimal built-in functionality to support it. This includes exposing the necessary event and having two methods - to raise it that mirror and - . For more extensive support, use . - - This attribute can be used as follows: - - [INotifyPropertyChanged] - partial class MyViewModel : SomeOtherClass - { - // Other members here... - } - - - - - - - Gets or sets a value indicating whether or not to also generate all the additional helper methods that are found - in as well (eg. . - If set to , only the event and - the two overloads will be generated. - The default value is . - - - - - An attribute that can be used to support properties in generated properties. When this attribute is - used, the generated property setter will also call for the properties specified - in the attribute data, causing the validation logic for the command to be executed again. This can be useful to keep the code compact - when there are one or more dependent commands that should also be notified when a property is updated. If this attribute is used in - a field without , it is ignored (just like ). - - In order to use this attribute, the target property has to implement the interface. - - - This attribute can be used as follows: - - partial class MyViewModel : ObservableObject - { - [ObservableProperty] - [NotifyCanExecuteChangedFor(nameof(GreetUserCommand))] - private string name; - - public IRelayCommand GreetUserCommand { get; } - } - - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - public string Name - { - get => name; - set - { - if (SetProperty(ref name, value)) - { - GreetUserCommand.NotifyCanExecuteChanged(); - } - } - } - } - - - - - - Initializes a new instance of the class. - - The name of the command to also notify when the annotated property changes. - - - - Initializes a new instance of the class. - - The name of the property to also notify when the annotated property changes. - - The other command names to also notify when the annotated property changes. This parameter can optionally - be used to indicate a series of dependent commands from the same attribute, to keep the code more compact. - - - - - Gets the command names to also notify when the annotated property changes. - - - - - An attribute that can be used to support in generated properties, when applied to - fields contained in a type that is inheriting from and using any validation attributes. - When this attribute is used, the generated property setter will also call . - This allows generated properties to opt-in into validation behavior without having to fallback into a full explicit observable property. - - This attribute can be used as follows: - - partial class MyViewModel : ObservableValidator - { - [ObservableProperty] - [NotifyDataErrorInfo] - [Required] - [MinLength(2)] - private string username; - } - - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - [Required] - [MinLength(2)] - public string Username - { - get => username; - set => SetProperty(ref username, value, validate: true); - } - } - - - - - - An attribute that can be used to support in generated properties. When this attribute is - used, the generated property setter will also call (or the equivalent - method in the target class) for the properties specified in the attribute data. This can be useful to keep the code compact when - there are one or more dependent properties that should also be reported as updated when the value of the annotated observable - property is changed. If this attribute is used in a field without , it is ignored. - - In order to use this attribute, the containing type has to implement the interface - and expose a method with the same signature as . If the containing - type also implements the interface and exposes a method with the same signature as - , then this method will be invoked as well by the property setter. - - - This attribute can be used as follows: - - partial class MyViewModel : ObservableObject - { - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(FullName))] - private string name; - - [ObservableProperty] - [NotifyPropertyChangedFor(nameof(FullName))] - private string surname; - - public string FullName => $"{Name} {Surname}"; - } - - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - public string Name - { - get => name; - set - { - if (!EqualityComparer<string>.Default.Equals(name, value)) - { - OnPropertyChanging(nameof(Name)); - OnPropertyChanged(nameof(FullName)); - - name = value; - - OnPropertyChanged(nameof(Name)); - OnPropertyChanged(nameof(FullName)); - } - } - } - - public string Surname - { - get => surname; - set - { - if (!EqualityComparer<string>.Default.Equals(name, value)) - { - OnPropertyChanging(nameof(Surname)); - OnPropertyChanged(nameof(FullName)); - - surname = value; - - OnPropertyChanged(nameof(Surname)); - OnPropertyChanged(nameof(FullName)); - } - } - } - } - - - - - - Initializes a new instance of the class. - - The name of the property to also notify when the annotated property changes. - - - - Initializes a new instance of the class. - - The name of the property to also notify when the annotated property changes. - - The other property names to also notify when the annotated property changes. This parameter can optionally - be used to indicate a series of dependent properties from the same attribute, to keep the code more compact. - - - - - Gets the property names to also notify when the annotated property changes. - - - - - An attribute that can be used to support in generated properties, when applied to fields - contained in a type that is either inheriting from , or annotated with . - When this attribute is used, the generated property setter will also call . - This allows generated properties to opt-in into broadcasting behavior without having to fallback into a full explicit observable property. - - This attribute can be used as follows: - - partial class MyViewModel : ObservableRecipient - { - [ObservableProperty] - [NotifyPropertyChangedRecipients] - private string username; - } - - - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - public string Username - { - get => username; - set => SetProperty(ref username, value, broadcast: true); - } - } - - - - This attribute can also be added to a class, and if so it will affect all generated properties in that type and inherited types. - - - - - - An attribute that indicates that a given type should have all the members from - generated into it, as well as the and - interfaces. This can be useful when you want the same functionality from into a class - that already inherits from another one (since C# doesn't support multiple inheritance). This attribute will trigger - the source generator to just create the same APIs directly into the decorated class. - - This attribute can be used as follows: - - [ObservableObject] - partial class MyViewModel : SomeOtherClass - { - // Other members here... - } - - - And with this, the same APIs from will be available on this type as well. - - - - - An attribute that indicates that a given field should be wrapped by a generated observable property. - In order to use this attribute, the containing type has to inherit from , or it - must be using or . - If the containing type also implements the (that is, if it either inherits from - or is using ), then the generated code will - also invoke to signal that event. - - This attribute can be used as follows: - - partial class MyViewModel : ObservableObject - { - [ObservableProperty] - private string name; - - [ObservableProperty] - private bool isEnabled; - } - - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - public string Name - { - get => name; - set => SetProperty(ref name, value); - } - - public bool IsEnabled - { - get => isEnabled; - set => SetProperty(ref isEnabled, value); - } - } - - - - The generated properties will automatically use the UpperCamelCase format for their names, - which will be derived from the field names. The generator can also recognize fields using either - the _lowerCamel or m_lowerCamel naming scheme. Otherwise, the first character in the - source field name will be converted to uppercase (eg. isEnabled to IsEnabled). - - - - - An attribute that indicates that a given type should have all the members from - generated into it. This can be useful when you want the same functionality from into - a class that already inherits from another one (since C# doesn't support multiple inheritance). This attribute will trigger - the source generator to just create the same APIs directly into the decorated class. For instance, this attribute can be - used to easily combine the functionality from both and , - by using as the base class and adding this attribute to the declared type. - - This attribute can be used as follows: - - [ObservableRecipient] - partial class MyViewModel : ObservableValidator - { - // Other members here... - } - - - And with this, the same APIs from will be available on this type as well. - - To avoid conflicts with other APIs in types where the new members are being generated, constructors are only generated when the annotated - type doesn't have any explicit constructors being declared. If that is the case, the same constructors from - are emitted, with the accessibility adapted to that of the annotated type. Otherwise, they are skipped, so the type being annotated has the - responsibility of properly initializing the property. Additionally, if the annotated type inherits - from , the overloads will be skipped - as well, as they would conflict with the methods. - - - - In order to work, needs to be applied to a type that inherits from - (either directly or indirectly), or to one decorated with . - This is because the methods rely on some of the inherited members to work. - If this condition is not met, the code will fail to build. - - - - - A base class for objects of which the properties must be observable. - - - - - - - - - - - Raises the event. - - The input instance. - Thrown if is . - - - - Raises the event. - - The input instance. - Thrown if is . - - - - Raises the event. - - (optional) The name of the property that changed. - - - - Raises the event. - - (optional) The name of the property that changed. - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with the new - value, then raises the event. - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised - if the current and new value for the target property are the same. - - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with the new - value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - The instance to use to compare the input values. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if is . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with the new - value, then raises the event. - This overload is much less efficient than and it - should only be used when the former is not viable (eg. when the target property being - updated does not directly expose a backing field that can be passed by reference). - For performance reasons, it is recommended to use a stateful callback if possible through - the whenever possible - instead of this overload, as that will allow the C# compiler to cache the input callback and - reduce the memory allocations. More info on that overload are available in the related XML - docs. This overload is here for completeness and in cases where that is not applicable. - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - A callback to invoke to update the property value. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised - if the current and new value for the target property are the same. - - Thrown if is . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with the new - value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - A callback to invoke to update the property value. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of , - with the difference being that this method is used to relay properties from a wrapped model in the - current instance. This type is useful when creating wrapping, bindable objects that operate over - models that lack support for notification (eg. for CRUD operations). - Suppose we have this model (eg. for a database row in a table): - - public class Person - { - public string Name { get; set; } - } - - We can then use a property to wrap instances of this type into our observable model (which supports - notifications), injecting the notification to the properties of that model, like so: - - public class BindablePerson : ObservableObject - { - public Model { get; } - - public BindablePerson(Person model) - { - Model = model; - } - - public string Name - { - get => Model.Name; - set => Set(Model.Name, value, Model, (model, name) => model.Name = name); - } - } - - This way we can then use the wrapping object in our application, and all those "proxy" properties will - also raise notifications when changed. Note that this method is not meant to be a replacement for - , and it should only be used when relaying properties to a model that - doesn't support notifications, and only if you can't implement notifications to that model directly (eg. by having - it inherit from ). The syntax relies on passing the target model and a stateless callback - to allow the C# compiler to cache the function, which results in much better performance and no memory usage. - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The model containing the property being updated. - The callback to invoke to set the target property value, if a change has occurred. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not - raised if the current and new value for the target property are the same. - - Thrown if or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of , - with the difference being that this method is used to relay properties from a wrapped model in the - current instance. See additional notes about this overload in . - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - The model containing the property being updated. - The callback to invoke to set the target property value, if a change has occurred. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if , or are . - - - - Compares the current and new values for a given field (which should be the backing - field for a property). If the value has changed, raises the - event, updates the field and then raises the event. - The behavior mirrors that of , with the difference being that - this method will also monitor the new value of the property (a generic ) and will also - raise the again for the target property when it completes. - This can be used to update bindings observing that or any of its properties. - This method and its overload specifically rely on the type, which needs - to be used in the backing field for the target property. The field doesn't need to be - initialized, as this method will take care of doing that automatically. The - type also includes an implicit operator, so it can be assigned to any instance directly. - Here is a sample property declaration using this method: - - private TaskNotifier myTask; - - public Task MyTask - { - get => myTask; - private set => SetAndNotifyOnCompletion(ref myTask, value); - } - - - The field notifier to modify. - The property's value after the change occurred. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised if the current - and new value for the target property are the same. The return value being only - indicates that the new value being assigned to is different than the previous one, - and it does not mean the new instance passed as argument is in any particular state. - - - - - Compares the current and new values for a given field (which should be the backing - field for a property). If the value has changed, raises the - event, updates the field and then raises the event. - This method is just like , - with the difference being an extra parameter with a callback being invoked - either immediately, if the new task has already completed or is , or upon completion. - - The field notifier to modify. - The property's value after the change occurred. - A callback to invoke to update the property value. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised - if the current and new value for the target property are the same. - - Thrown if is . - - - - Compares the current and new values for a given field (which should be the backing - field for a property). If the value has changed, raises the - event, updates the field and then raises the event. - The behavior mirrors that of , with the difference being that - this method will also monitor the new value of the property (a generic ) and will also - raise the again for the target property when it completes. - This can be used to update bindings observing that or any of its properties. - This method and its overload specifically rely on the type, which needs - to be used in the backing field for the target property. The field doesn't need to be - initialized, as this method will take care of doing that automatically. The - type also includes an implicit operator, so it can be assigned to any instance directly. - Here is a sample property declaration using this method: - - private TaskNotifier<int> myTask; - - public Task<int> MyTask - { - get => myTask; - private set => SetAndNotifyOnCompletion(ref myTask, value); - } - - - The type of result for the to set and monitor. - The field notifier to modify. - The property's value after the change occurred. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised if the current - and new value for the target property are the same. The return value being only - indicates that the new value being assigned to is different than the previous one, - and it does not mean the new instance passed as argument is in any particular state. - - - - - Compares the current and new values for a given field (which should be the backing - field for a property). If the value has changed, raises the - event, updates the field and then raises the event. - This method is just like , - with the difference being an extra parameter with a callback being invoked - either immediately, if the new task has already completed or is , or upon completion. - - The type of result for the to set and monitor. - The field notifier to modify. - The property's value after the change occurred. - A callback to invoke to update the property value. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - The and events are not raised - if the current and new value for the target property are the same. - - Thrown if is . - - - - Implements the notification logic for the related methods. - - The type of to set and monitor. - The field notifier. - The property's value after the change occurred. - (optional) A callback to invoke to update the property value. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - - - An interface for task notifiers of a specified type. - - The type of value to store. - - - - Gets or sets the wrapped value. - - - - - A wrapping class that can hold a value. - - - - - Initializes a new instance of the class. - - - - - - - - Unwraps the value stored in the current instance. - - The input instance. - - - - A wrapping class that can hold a value. - - The type of value for the wrapped instance. - - - - Initializes a new instance of the class. - - - - - - - - Unwraps the value stored in the current instance. - - The input instance. - - - - A base class for observable objects that also acts as recipients for messages. This class is an extension of - which also provides built-in support to use the type. - - - - - Initializes a new instance of the class. - - - This constructor will produce an instance that will use the instance - to perform requested operations. It will also be available locally through the property. - - - - - Initializes a new instance of the class. - - The instance to use to send messages. - Thrown if is . - - - - Gets the instance in use. - - - - - Gets or sets a value indicating whether the current view model is currently active. - - - - - Invoked whenever the property is set to . - Use this method to register to messages and do other initialization for this instance. - - - The base implementation registers all messages for this recipients that have been declared - explicitly through the interface, using the default channel. - For more details on how this works, see the method. - If you need more fine tuned control, want to register messages individually or just prefer - the lambda-style syntax for message registration, override this method and register manually. - - - - - Invoked whenever the property is set to . - Use this method to unregister from messages and do general cleanup for this instance. - - - The base implementation unregisters all messages for this recipient. It does so by - invoking , which removes all registered - handlers for a given subscriber, regardless of what token was used to register them. - That is, all registered handlers across all subscription channels will be removed. - - - - - Broadcasts a with the specified - parameters, without using any particular token (so using the default channel). - - The type of the property that changed. - The value of the property before it changed. - The value of the property after it changed. - The name of the property that changed. - - You should override this method if you wish to customize the channel being - used to send the message (eg. if you need to use a specific token for the channel). - - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - This method is just like , just with the addition - of the parameter. As such, following the behavior of the base method, - the and events - are not raised if the current and new value for the target property are the same. - - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - The instance to use to compare the input values. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if is . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. Similarly to - the method, this overload should only be - used when can't be used directly. - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - A callback to invoke to update the property value. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - This method is just like , just with the addition - of the parameter. As such, following the behavior of the base method, - the and events - are not raised if the current and new value for the target property are the same. - - Thrown if is . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - A callback to invoke to update the property value. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of - , with the difference being that this - method is used to relay properties from a wrapped model in the current instance. For more info, see the docs for - . - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The model - The callback to invoke to set the target property value, if a change has occurred. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of - , - with the difference being that this method is used to relay properties from a wrapped model in the - current instance. For more info, see the docs for - . - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - The model - The callback to invoke to set the target property value, if a change has occurred. - If , will also be invoked. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if , or are . - - - - A base class for objects implementing the interface. This class - also inherits from , so it can be used for observable items too. - - - - - The instance used to track compiled delegates to validate entities. - - - - - The instance used to track display names for properties to validate. - - - This is necessary because we want to reuse the same instance for all validations, but - with the same behavior with respect to formatted names that new instances would have provided. The issue is that the - property is not refreshed when we set , - so we need to replicate the same logic to retrieve the right display name for properties to validate and update that - property manually right before passing the context to and proceed with the normal functionality. - - - - - The cached for . - - - - - The instance currently in use. - - - - - The instance used to store previous validation results. - - - - - Indicates the total number of properties with errors (not total errors). - This is used to allow to operate in O(1) time, as it can just - check whether this value is not 0 instead of having to traverse . - - - - - - - - Initializes a new instance of the class. - This constructor will create a new that will - be used to validate all properties, which will reference the current instance - and no additional services or validation properties and settings. - - - - - Initializes a new instance of the class. - This constructor will create a new that will - be used to validate all properties, which will reference the current instance. - - A set of key/value pairs to make available to consumers. - - - - Initializes a new instance of the class. - This constructor will create a new that will - be used to validate all properties, which will reference the current instance. - - An instance to make available during validation. - A set of key/value pairs to make available to consumers. - - - - Initializes a new instance of the class. - This constructor will store the input instance, - and it will use it to validate all properties for the current viewmodel. - - - The instance to use to validate properties. - - This instance will be passed to all - calls executed by the current viewmodel, and its property will be updated every time - before the call is made to set the name of the property being validated. The property name will not be reset after that, so the - value of will always indicate the name of the last property that was validated, if any. - - - Thrown if is . - - - - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - This method is just like , just with the addition - of the parameter. If that is set to , the new value will be - validated and will be raised if needed. Following the behavior of the base method, - the and events - are not raised if the current and new value for the target property are the same. - - Thrown if is . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - The instance to use to compare the input values. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if or are . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. Similarly to - the method, this overload should only be - used when can't be used directly. - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - A callback to invoke to update the property value. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - - This method is just like , just with the addition - of the parameter. As such, following the behavior of the base method, - the and events - are not raised if the current and new value for the target property are the same. - - Thrown if or are . - - - - Compares the current and new values for a given property. If the value has changed, - raises the event, updates the property with - the new value, then raises the event. - See additional notes about this overload in . - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - A callback to invoke to update the property value. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if , or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of - , with the difference being that this - method is used to relay properties from a wrapped model in the current instance. For more info, see the docs for - . - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The model - The callback to invoke to set the target property value, if a change has occurred. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if , or are . - - - - Compares the current and new values for a given nested property. If the value has changed, - raises the event, updates the property and then raises the - event. The behavior mirrors that of - , - with the difference being that this method is used to relay properties from a wrapped model in the - current instance. For more info, see the docs for - . - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - The model - The callback to invoke to set the target property value, if a change has occurred. - If , will also be validated. - (optional) The name of the property that changed. - if the property was changed, otherwise. - Thrown if , , or are . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if is . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of the property that changed. - The field storing the property's value. - The property's value after the change occurred. - The instance to use to compare the input values. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if or are . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - A callback to invoke to update the property value. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if or are . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of the property that changed. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - A callback to invoke to update the property value. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if , or are . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The model - The callback to invoke to set the target property value, if a change has occurred. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if , or are . - - - - Tries to validate a new value for a specified property. If the validation is successful, - is called, otherwise no state change is performed. - - The type of model whose property (or field) to set. - The type of property (or field) to set. - The current property value. - The property's value after the change occurred. - The instance to use to compare the input values. - The model - The callback to invoke to set the target property value, if a change has occurred. - The resulting validation errors, if any. - (optional) The name of the property that changed. - Whether the validation was successful and the property value changed as well. - Thrown if , , or are . - - - - Clears the validation errors for a specified property or for the entire entity. - - - The name of the property to clear validation errors for. - If a or empty name is used, all entity-level errors will be cleared. - - - - - - - - - - - Validates all the properties in the current instance and updates all the tracked errors. - If any changes are detected, the event will be raised. - - - Only public instance properties (excluding custom indexers) that have at least one - applied to them will be validated. All other - members in the current instance will be ignored. None of the processed properties - will be modified - they will only be used to retrieve their values and validate them. - - - - - Validates a property with a specified name and a given input value. - If any changes are detected, the event will be raised. - - The value to test for the specified property. - The name of the property to validate. - Thrown when is . - - - - Tries to validate a property with a specified name and a given input value, and returns - the computed errors, if any. If the property is valid, it is assumed that its value is - about to be set in the current object. Otherwise, no observable local state is modified. - - The value to test for the specified property. - The name of the property to validate. - The resulting validation errors, if any. - - - - Clears all the current errors for the entire entity. - - - - - Clears all the current errors for a target property. - - The name of the property to clear errors for. - - - - Gets the display name for a given property. It could be a custom name or just the property name. - - The target property name being validated. - The display name for the property. - - - - An internal helper to support the source generator APIs related to . - This type is not intended to be used directly by user code. - - - - - Invokes externally on a target instance. - - The target instance. - The value to test for the specified property. - The name of the property to validate. - - - - An internal helper used to support and generated code from its template. - This type is not intended to be used directly by user code. - - - - - Gets an awaitable object that skips end validation. - - The input to get the awaitable for. - A object wrapping . - - - - A custom task awaitable object that skips end validation. - - - - - The wrapped instance to create an awaiter for. - - - - - Creates a new instance with the specified parameters. - - The wrapped instance to create an awaiter for. - - - - Gets an instance for the current underlying task. - - An instance for the current underlying task. - - - - An awaiter object for . - - - - - The underlying instance. - - - - - Creates a new instance with the specified parameters. - - The wrapped instance to create an awaiter for. - - - - Gets whether the operation has completed or not. - - This property is intended for compiler user rather than use directly in code. - - - - Ends the await operation. - - This method is intended for compiler user rather than use directly in code. - - - - - - - - - - A type that facilitates the use of the type. - The provides the ability to configure services in a singleton, thread-safe - service provider instance, which can then be used to resolve service instances. - The first step to use this feature is to declare some services, for instance: - - public interface ILogger - { - void Log(string text); - } - - - public class ConsoleLogger : ILogger - { - void Log(string text) => Console.WriteLine(text); - } - - Then the services configuration should then be done at startup, by calling the - method and passing an instance with the services to use. That instance can - be from any library offering dependency injection functionality, such as Microsoft.Extensions.DependencyInjection. - For instance, using that library, can be used as follows in this example: - - Ioc.Default.ConfigureServices( - new ServiceCollection() - .AddSingleton<ILogger, Logger>() - .BuildServiceProvider()); - - Finally, you can use the instance (which implements ) - to retrieve the service instances from anywhere in your application, by doing as follows: - - Ioc.Default.GetService<ILogger>().Log("Hello world!"); - - - - - - Gets the default instance. - - - - - The instance to use, if initialized. - - - - - - - - Tries to resolve an instance of a specified service type. - - The type of service to resolve. - An instance of the specified service, or . - Thrown if the current instance has not been initialized. - - - - Resolves an instance of a specified service type. - - The type of service to resolve. - An instance of the specified service, or . - - Thrown if the current instance has not been initialized, or if the - requested service type was not registered in the service provider currently in use. - - - - - Initializes the shared instance. - - The input instance to use. - Thrown if is . - - - - Throws an when the property is used before initialization. - - - - - Throws an when the property is missing a type registration. - - - - - Throws an when a configuration is attempted more than once. - - - - - A command that mirrors the functionality of , with the addition of - accepting a returning a as the execute - action, and providing an property that notifies changes when - is invoked and when the returned completes. - - - - - The cached for . - - - - - The cached for . - - - - - The cached for . - - - - - The cached for . - - - - - The to invoke when is used. - - - - - The cancelable to invoke when is used. - - Only one between this and is not . - - - - The optional action to invoke when is used. - - - - - The options being set for the current command. - - - - - The instance to use to cancel . - - This is only used when is not . - - - - - - - - - - Initializes a new instance of the class. - - The execution logic. - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The options to use to configure the async command. - Thrown if is . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - Thrown if is . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The options to use to configure the async command. - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - Thrown if or are . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - The options to use to configure the async command. - Thrown if or are . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The execution status logic. - Thrown if or are . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The execution status logic. - The options to use to configure the async command. - Thrown if or are . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Awaits an input and throws an exception on the calling context, if the task fails. - - The input instance to await. - - - - Options to customize the behavior of and instances. - - - - - No option is specified. The and types will use their default behavior: - - Concurrent execution is disallowed: a command is disabled if there is a pending asynchronous execution running. - - - Exceptions are thrown on the calling context: calling will await the - returned for the operation, and propagate the exception on the calling context. - - This behavior is consistent with synchronous commands, where exceptions in behave the same. - - - - - - - Concurrent executions are allowed. This option makes it so that the same command can be invoked concurrently multiple times. - - Note that additional considerations should be taken into account in this case: - - If the command supports cancellation, previous invocations will automatically be canceled if a new one is started. - The property will always represent the operation that was started last. - - - - - - - Exceptions are not thrown on the calling context, and are propagated to instead. - - This affects how calls to behave. When this option is used, if an operation fails, that exception will not - be rethrown on the calling context (as it is not awaited there). Instead, it will flow to . - - - This option enables more advanced scenarios, where the property can be used to inspect the state of an operation - that was queued. That is, even if the operation failed or was canceled, the details of that can be retrieved at a later time by accessing this property. - - - - - - A generic command that provides a more specific version of . - - The type of parameter being passed as input to the callbacks. - - - - The to invoke when is used. - - - - - The cancelable to invoke when is used. - - - - - The optional action to invoke when is used. - - - - - The options being set for the current command. - - - - - The instance to use to cancel . - - - - - - - - - - - Initializes a new instance of the class. - - The execution logic. - See notes in . - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The options to use to configure the async command. - See notes in . - Thrown if is . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - See notes in . - Thrown if is . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The options to use to configure the async command. - See notes in . - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - See notes in . - Thrown if or are . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - The options to use to configure the async command. - See notes in . - Thrown if or are . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The execution status logic. - See notes in . - Thrown if or are . - - - - Initializes a new instance of the class. - - The cancelable execution logic. - The execution status logic. - The options to use to configure the async command. - See notes in . - Thrown if or are . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - An attribute that can be used to automatically generate properties from declared methods. When this attribute - is used to decorate a method, a generator will create a command property with the corresponding interface - depending on the signature of the method. If an invalid method signature is used, the generator will report an error. - - In order to use this attribute, the containing type doesn't need to implement any interfaces. The generated properties will be lazily - assigned but their value will never change, so there is no need to support property change notifications or other additional functionality. - - - This attribute can be used as follows: - - partial class MyViewModel - { - [RelayCommand] - private void GreetUser(User? user) - { - Console.WriteLine($"Hello {user.Name}!"); - } - } - - And with this, code analogous to this will be generated: - - partial class MyViewModel - { - private RelayCommand? greetUserCommand; - - public IRelayCommand GreetUserCommand => greetUserCommand ??= new RelayCommand(GreetUser); - } - - - - The following signatures are supported for annotated methods: - - void Method(); - - Will generate an property (using a instance). - - void Method(T?); - - Will generate an property (using a instance). - - Task Method(); - Task Method(CancellationToken); - Task<T> Method(); - Task<T> Method(CancellationToken); - - Will both generate an property (using an instance). - - Task Method(T?); - Task Method(T?, CancellationToken); - Task<T> Method(T?); - Task<T> Method(T?, CancellationToken); - - Will both generate an property (using an instance). - - - - - - Gets or sets the name of the property or method that will be invoked to check whether the - generated command can be executed at any given time. The referenced member needs to return - a value, and has to have a signature compatible with the target command. - - - - - Gets or sets a value indicating whether or not to allow concurrent executions for an asynchronous command. - - When set for an attribute used on a method that would result in an or an - property to be generated, this will modify the behavior of these commands - when an execution is invoked while a previous one is still running. It is the same as creating an instance of - these command types with a constructor such as - and using the value. - - - Using this property is not valid if the target command doesn't map to an asynchronous command. - - - - Gets or sets a value indicating whether or not to exceptions should be propagated to . - - When set for an attribute used on a method that would result in an or an - property to be generated, this will modify the behavior of these commands - in case an exception is thrown by the underlying operation. It is the same as creating an instance of - these command types with a constructor such as - and using the value. - - - Using this property is not valid if the target command doesn't map to an asynchronous command. - - - - Gets or sets a value indicating whether a cancel command should also be generated for an asynchronous command. - - When set to , this additional code will be generated: - - partial class MyViewModel - { - private ICommand? loginUserCancelCommand; - - public ICommand LoginUserCancelCommand => loginUserCancelCommand ??= LoginUserCommand.CreateCancelCommand(); - } - - Where LoginUserCommand is an defined in the class (or generated by this attribute as well). - - - Using this property is not valid if the target command doesn't map to a cancellable asynchronous command. - - - - Extensions for the type. - - - - - Creates an instance that can be used to cancel execution on the input command. - The returned command will also notify when it can be executed based on the state of the wrapped command. - - The input instance to create a cancellation command for. - An instance that can be used to monitor and signal cancellation for . - The returned instance is not guaranteed to be unique across multiple invocations with the same arguments. - Thrown if is . - - - - An interface expanding to support asynchronous operations. - - - - - Gets the last scheduled , if available. - This property notifies a change when the completes. - - - - - Gets a value indicating whether a running operation for this command can currently be canceled. - - - The exact sequence of events that types implementing this interface should raise is as follows: - - - The command is initially not running: , - and are . - - - The command starts running: and switch to - . is set to . - - - If the operation is canceled: switches to - and switches to . - - - The operation completes: and switch - to . The state of is undefined. - - - This only applies if the underlying logic for the command actually supports cancelation. If that is - not the case, then and will always remain - regardless of the current state of the command. - - - - - Gets a value indicating whether a cancelation request has been issued for the current operation. - - - - - Gets a value indicating whether the command currently has a pending operation being executed. - - - - - Provides a more specific version of , - also returning the representing the async operation being executed. - - The input parameter. - The representing the async operation being executed. - Thrown if is incompatible with the underlying command implementation. - - - - Communicates a request for cancelation. - - - If the underlying command is not running, or if it does not support cancelation, this method will perform no action. - Note that even with a successful cancelation, the completion of the current operation might not be immediate. - - - - - A generic interface representing a more specific version of . - - The type used as argument for the interface methods. - This interface is needed to solve the diamond problem with base classes. - - - - Provides a strongly-typed variant of . - - The input parameter. - The representing the async operation being executed. - - - - An interface expanding with the ability to raise - the event externally. - - - - - Notifies that the property has changed. - - - - - A generic interface representing a more specific version of . - - The type used as argument for the interface methods. - - - - Provides a strongly-typed variant of . - - The input parameter. - Whether or not the current command can be executed. - Use this overload to avoid boxing, if is a value type. - - - - Provides a strongly-typed variant of . - - The input parameter. - Use this overload to avoid boxing, if is a value type. - - - - A implementation wrapping to support cancellation. - - - - - The wrapped instance. - - - - - Creates a new instance. - - The instance to wrap. - - - - - - - - - - - - - - - - A reusable instance that is always disabled. - - - - - - - - Gets a shared, reusable instance. - - - This instance can safely be used across multiple objects without having - to worry about this static keeping others alive, as the event uses a - custom accessor that just discards items (as the event is known to never - be raised). As such, this instance will never act as root for other objects. - - - - - - - - - - - An interface for commands that know whether they support cancellation or not. - - - - - Gets whether or not the current command supports cancellation. - - - - - A command whose sole purpose is to relay its functionality to other - objects by invoking delegates. The default return value for the - method is . This type does not allow you to accept command parameters - in the and callback methods. - - - - - The to invoke when is used. - - - - - The optional action to invoke when is used. - - - - - - - - Initializes a new instance of the class that can always execute. - - The execution logic. - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - Thrown if or are . - - - - - - - - - - - - - A generic command whose sole purpose is to relay its functionality to other - objects by invoking delegates. The default return value for the CanExecute - method is . This class allows you to accept command parameters - in the and callback methods. - - The type of parameter being passed as input to the callbacks. - - - - The to invoke when is used. - - - - - The optional action to invoke when is used. - - - - - - - - Initializes a new instance of the class that can always execute. - - The execution logic. - - Due to the fact that the interface exposes methods that accept a - nullable parameter, it is recommended that if is a reference type, - you should always declare it as nullable, and to always perform checks within . - - Thrown if is . - - - - Initializes a new instance of the class. - - The execution logic. - The execution status logic. - See notes in . - Thrown if or are . - - - - - - - - - - - - - - - - - - - Tries to get a command argument of compatible type from an input . - - The input parameter. - The resulting value, if any. - Whether or not a compatible command argument could be retrieved. - - - - Throws an if an invalid command argument is used. - - The input parameter. - Thrown with an error message to give info on the invalid parameter. - - - - An interface for a type providing the ability to exchange messages between different objects. - This can be useful to decouple different modules of an application without having to keep strong - references to types being referenced. It is also possible to send messages to specific channels, uniquely - identified by a token, and to have different messengers in different sections of an applications. - In order to use the functionalities, first define a message type, like so: - - public sealed class LoginCompletedMessage { } - - Then, register your a recipient for this message: - - Messenger.Default.Register<MyRecipientType, LoginCompletedMessage>(this, (r, m) => - { - // Handle the message here... - }); - - The message handler here is a lambda expression taking two parameters: the recipient and the message. - This is done to avoid the allocations for the closures that would've been generated if the expression - had captured the current instance. The recipient type parameter is used so that the recipient can be - directly accessed within the handler without the need to manually perform type casts. This allows the - code to be less verbose and more reliable, as all the checks are done just at build time. If the handler - is defined within the same type as the recipient, it is also possible to directly access private members. - This allows the message handler to be a static method, which enables the C# compiler to perform a number - of additional memory optimizations (such as caching the delegate, avoiding unnecessary memory allocations). - Finally, send a message when needed, like so: - - Messenger.Default.Send<LoginCompletedMessage>(); - - Additionally, the method group syntax can also be used to specify the message handler - to invoke when receiving a message, if a method with the right signature is available - in the current scope. This is helpful to keep the registration and handling logic separate. - Following up from the previous example, consider a class having this method: - - private static void Receive(MyRecipientType recipient, LoginCompletedMessage message) - { - // Handle the message there - } - - The registration can then be performed in a single line like so: - - Messenger.Default.Register(this, Receive); - - The C# compiler will automatically convert that expression to a instance - compatible with . - This will also work if multiple overloads of that method are available, each handling a different - message type: the C# compiler will automatically pick the right one for the current message type. - It is also possible to register message handlers explicitly using the interface. - To do so, the recipient just needs to implement the interface and then call the - extension, which will automatically register - all the handlers that are declared by the recipient type. Registration for individual handlers is supported as well. - - - - - Checks whether or not a given recipient has already been registered for a message. - - The type of message to check for the given recipient. - The type of token to check the channel for. - The target recipient to check the registration for. - The token used to identify the target channel to check. - Whether or not has already been registered for the specified message. - Thrown if or are . - - - - Registers a recipient for a given type of message. - - The type of recipient for the message. - The type of message to receive. - The type of token to use to pick the messages to receive. - The recipient that will receive the messages. - A token used to determine the receiving channel to use. - The to invoke when a message is received. - Thrown if , or are . - Thrown when trying to register the same message twice. - - - - Unregisters a recipient from all registered messages. - - The recipient to unregister. - - This method will unregister the target recipient across all channels. - Use this method as an easy way to lose all references to a target recipient. - If the recipient has no registered handler, this method does nothing. - - Thrown if is . - - - - Unregisters a recipient from all messages on a specific channel. - - The type of token to identify what channel to unregister from. - The recipient to unregister. - The token to use to identify which handlers to unregister. - If the recipient has no registered handler, this method does nothing. - Thrown if or are . - - - - Unregisters a recipient from messages of a given type. - - The type of message to stop receiving. - The type of token to identify what channel to unregister from. - The recipient to unregister. - The token to use to identify which handlers to unregister. - If the recipient has no registered handler, this method does nothing. - Thrown if or are . - - - - Sends a message of the specified type to all registered recipients. - - The type of message to send. - The type of token to identify what channel to use to send the message. - The message to send. - The token indicating what channel to use. - The message that was sent (ie. ). - Thrown if or are . - - - - Performs a cleanup on the current messenger. - Invoking this method does not unregister any of the currently registered - recipient, and it can be used to perform cleanup operations such as - trimming the internal data structures of a messenger implementation. - - - - - Resets the instance and unregisters all the existing recipients. - - - - - Extensions for the type. - - - - - - A class that acts as a container to load the instance linked to - the method. - This class is needed to avoid forcing the initialization code in the static constructor to run as soon as - the type is referenced, even if that is done just to use methods - that do not actually require this instance to be available. - We're effectively using this type to leverage the lazy loading of static constructors done by the runtime. - - - - - The instance associated with . - - - - - A non-generic version of . - - - - - The instance used to track the preloaded registration action for each recipient. - - - - - A class that acts as a static container to associate a instance to each - type in use. This is done because we can only use a single type as key, but we need to track - associations of each recipient type also across different communication channels, each identified by a token. - Since the token is actually a compile-time parameter, we can use a wrapping class to let the runtime handle a different - instance for each generic type instantiation. This lets us only worry about the recipient type being inspected. - - The token indicating what channel to use. - - - - The instance used to track the preloaded registration action for each recipient. - - - - - Checks whether or not a given recipient has already been registered for a message. - - The type of message to check for the given recipient. - The instance to use to check the registration. - The target recipient to check the registration for. - Whether or not has already been registered for the specified message. - This method will use the default channel to check for the requested registration. - Thrown if or are . - - - - Registers all declared message handlers for a given recipient, using the default channel. - - The instance to use to register the recipient. - The recipient that will receive the messages. - See notes for for more info. - Thrown if or are . - - - - Registers all declared message handlers for a given recipient. - - The type of token to identify what channel to use to receive messages. - The instance to use to register the recipient. - The recipient that will receive the messages. - The token indicating what channel to use. - - This method will register all messages corresponding to the interfaces - being implemented by . If none are present, this method will do nothing. - Note that unlike all other extensions, this method will use reflection to find the handlers to register. - Once the registration is complete though, the performance will be exactly the same as with handlers - registered directly through any of the other generic extensions for the interface. - - Thrown if , or are . - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The instance to use to register the recipient. - The recipient that will receive the messages. - Thrown when trying to register the same message twice. - This method will use the default channel to perform the requested registration. - Thrown if or are . - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The type of token to identify what channel to use to receive messages. - The instance to use to register the recipient. - The recipient that will receive the messages. - The token indicating what channel to use. - Thrown when trying to register the same message twice. - This method will use the default channel to perform the requested registration. - Thrown if , or are . - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The instance to use to register the recipient. - The recipient that will receive the messages. - The to invoke when a message is received. - Thrown when trying to register the same message twice. - This method will use the default channel to perform the requested registration. - Thrown if , or are . - - - - Registers a recipient for a given type of message. - - The type of recipient for the message. - The type of message to receive. - The instance to use to register the recipient. - The recipient that will receive the messages. - The to invoke when a message is received. - Thrown when trying to register the same message twice. - This method will use the default channel to perform the requested registration. - Thrown if , or are . - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The type of token to use to pick the messages to receive. - The instance to use to register the recipient. - The recipient that will receive the messages. - A token used to determine the receiving channel to use. - The to invoke when a message is received. - Thrown when trying to register the same message twice. - Thrown if , or are . - - - - Unregisters a recipient from messages of a given type. - - The type of message to stop receiving. - The instance to use to unregister the recipient. - The recipient to unregister. - - This method will unregister the target recipient only from the default channel. - If the recipient has no registered handler, this method does nothing. - - Thrown if or are . - - - - Sends a message of the specified type to all registered recipients. - - The type of message to send. - The instance to use to send the message. - The message that has been sent. - - This method is a shorthand for when the - message type exposes a parameterless constructor: it will automatically create - a new instance and send that to its recipients. - - Thrown if is . - - - - Sends a message of the specified type to all registered recipients. - - The type of message to send. - The instance to use to send the message. - The message to send. - The message that was sent (ie. ). - Thrown if or are . - - - - Sends a message of the specified type to all registered recipients. - - The type of message to send. - The type of token to identify what channel to use to send the message. - The instance to use to send the message. - The token indicating what channel to use. - The message that has been sen. - - This method will automatically create a new instance - just like , and then send it to the right recipients. - - Thrown if or are . - - - - Creates an instance that can be used to be notified whenever a message of a given type is broadcast by a messenger. - - The type of message to use to receive notification for through the resulting instance. - The instance to use to register the recipient. - An instance to receive notifications for messages being broadcast. - Thrown if is . - - - - Creates an instance that can be used to be notified whenever a message of a given type is broadcast by a messenger. - - The type of message to use to receive notification for through the resulting instance. - The type of token to identify what channel to use to receive messages. - The instance to use to register the recipient. - A token used to determine the receiving channel to use. - An instance to receive notifications for messages being broadcast. - Thrown if or are . - - - - An implementations for a given message type. - - The type of messages to listen to. - - - - The instance to use to register the recipient. - - - - - Creates a new instance with the given parameters. - - The instance to use to register the recipient. - - - - - - - An implementation for . - - - - - The instance to use to register the recipient. - - - - - The target instance currently in use. - - - - - Creates a new instance with the specified parameters. - - The instance to use to register the recipient. - The instance to use to create the recipient for. - - - - - - - - - - An implementations for a given pair of message and token types. - - The type of messages to listen to. - The type of token to identify what channel to use to receive messages. - - - - The instance to use to register the recipient. - - - - - The token used to determine the receiving channel to use. - - - - - Creates a new instance with the given parameters. - - The instance to use to register the recipient. - A token used to determine the receiving channel to use. - - - - - - - An implementation for . - - - - - The instance to use to register the recipient. - - - - - The target instance currently in use. - - - - - The token used to determine the receiving channel to use. - - - - - Creates a new instance with the specified parameters. - - The instance to use to register the recipient. - The instance to use to create the recipient for. - A token used to determine the receiving channel to use. - - - - - - - - - - A simple buffer writer implementation using pooled arrays. - - The type of items to store in the list. - - This type is a to avoid the object allocation and to - enable the pattern-based support. We aren't worried with consumers not - using this type correctly since it's private and only accessible within the parent type. - - - - - The default buffer size to use to expand empty arrays. - - - - - The underlying array. - - - - - The span mapping to . - - All writes are done through this to avoid covariance checks. - - - - The starting offset within . - - - - - Creates a new instance of the struct. - - A new instance. - - - - Gets a with the current items. - - - - - Adds a new item to the current collection. - - The item to add. - - - - Resets the underlying array and the stored items. - - - - - Resizes when there is no space left for new items, then adds one - - The item to add. - - - - - - - A dispatcher type that invokes a given callback. - - - This type is used to avoid type aliasing with when the generic - arguments are not known. Additionally, this is an abstract class and not an interface so that when - is called, virtual dispatch will be used instead of interface - stub dispatch, which is much slower and with more indirections. - - - - - Invokes the current callback on a target recipient, with a specified message. - - The target recipient for the message. - The message being broadcast. - - - - A generic version of . - - The type of recipient for the message. - The type of message to receive. - - - - The underlying callback to invoke. - - - - - Initializes a new instance of the class. - - The input instance. - - - - - - - A simple type representing an immutable pair of types. - - - This type replaces a simple as it's faster in its - and methods, and because - unlike a value tuple it exposes its fields as immutable. Additionally, the - and fields provide additional clarity reading - the code compared to and . - - - - - The type of registered message. - - - - - The type of registration token. - - - - - Initializes a new instance of the struct. - - The type of registered message. - The type of registration token. - - - - - - - - - - - - - An empty type representing a generic token with no specific value. - - - - - - - - - - - - - - An interface for a recipient that declares a registration for a specific message type. - - The type of message to receive. - - - - Receives a given message instance. - - The message being received. - - - - A used to represent actions to invoke when a message is received. - The recipient is given as an input argument to allow message registrations to avoid creating - closures: if an instance method on a recipient needs to be invoked it is possible to just - cast the recipient to the right type and then access the local method from that instance. - - The type of recipient for the message. - The type of message to receive. - The recipient that is receiving the message. - The message being received. - - - - A for request messages that can receive multiple replies, which can either be used directly or through derived classes. - - The type of request to make. - - - - The collection of received replies. We accept both instance, representing already running - operations that can be executed in parallel, or instances, which can be used so that multiple - asynchronous operations are only started sequentially from and do not overlap in time. - - - - - The instance used to link the token passed to - and the one passed to all subscribers to the message. - - - - - Gets the instance that will be linked to the - one used to asynchronously enumerate the received responses. This can be used to cancel asynchronous - replies that are still being processed, if no new items are needed from this request message. - Consider the following example, where we define a message to retrieve the currently opened documents: - - public class OpenDocumentsRequestMessage : AsyncCollectionRequestMessage<XmlDocument> { } - - We can then request and enumerate the results like so: - - await foreach (var document in Messenger.Default.Send<OpenDocumentsRequestMessage>()) - { - // Process each document here... - } - - If we also want to control the cancellation of the token passed to each subscriber to the message, - we can do so by passing a token we control to the returned message before starting the enumeration - (). - The previous snippet with this additional change looks as follows: - - await foreach (var document in Messenger.Default.Send<OpenDocumentsRequestMessage>().WithCancellation(cts.Token)) - { - // Process each document here... - } - - When no more new items are needed (or for any other reason depending on the situation), the token - passed to the enumerator can be canceled (by calling ), - and that will also notify the remaining tasks in the request message. The token exposed by the message - itself will automatically be linked and canceled with the one passed to the enumerator. - - - - - Replies to the current request message. - - The response to use to reply to the request message. - - - - Replies to the current request message. - - The response to use to reply to the request message. - Thrown if is . - - - - Replies to the current request message. - - The response to use to reply to the request message. - Thrown if is . - - - - Gets the collection of received response items. - - A value to stop the operation. - The collection of received response items. - - - - - - - A for async request messages, which can either be used directly or through derived classes. - - The type of request to make. - - - - Gets the message response. - - Thrown when is . - - - - Gets a value indicating whether a response has already been assigned to this instance. - - - - - Replies to the current request message. - - The response to use to reply to the request message. - Thrown if has already been set. - - - - Replies to the current request message. - - The response to use to reply to the request message. - Thrown if is . - Thrown if has already been set. - - - - - - - Throws an when a response is not available. - - - - - Throws an when or are called twice. - - - - - A for request messages that can receive multiple replies, which can either be used directly or through derived classes. - - The type of request to make. - - - - Gets the message responses. - - - - - Replies to the current request message. - - The response to use to reply to the request message. - - - - - - - - - - A message used to broadcast property changes in observable objects. - - The type of the property to broadcast the change for. - - - - Initializes a new instance of the class. - - The original sender of the broadcast message. - The name of the property that changed. - The value that the property had before the change. - The value that the property has after the change. - Thrown if is . - - - - Gets the original sender of the broadcast message. - - - - - Gets the name of the property that changed. - - - - - Gets the value that the property had before the change. - - - - - Gets the value that the property has after the change. - - - - - A for request messages, which can either be used directly or through derived classes. - - The type of request to make. - - - - Gets the message response. - - Thrown when is . - - - - Gets a value indicating whether a response has already been assigned to this instance. - - - - - Replies to the current request message. - - The response to use to reply to the request message. - Thrown if has already been set. - - - - Implicitly gets the response from a given instance. - - The input instance. - Thrown if is . - Thrown when is . - - - - Throws an when a response is not available. - - - - - Throws an when is called twice. - - - - - A base message that signals whenever a specific value has changed. - - The type of value that has changed. - - - - Initializes a new instance of the class. - - The value that has changed. - - - - Gets the value that has changed. - - - - - A class providing a reference implementation for the interface. - - - This implementation uses strong references to track the registered - recipients, so it is necessary to manually unregister them when they're no longer needed. - - - - - The collection of currently registered recipients, with a link to their linked message receivers. - - - This collection is used to allow reflection-free access to all the existing - registered recipients from and other methods in this type, - so that all the existing handlers can be removed without having to dynamically create - the generic types for the containers of the various dictionaries mapping the handlers. - - - - - The and instance for types combination. - - - The values are just of type as we don't know the type parameters in advance. - Each method relies on to get the type-safe instance of the - or class for each pair of generic arguments in use. - - - - - Gets the default instance. - - - - - - - - - - - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The type of token to use to pick the messages to receive. - The recipient that will receive the messages. - A token used to determine the receiving channel to use. - The input instance to register, or null. - Thrown when trying to register the same message twice. - - - - - - - - - - - - - - - - - - - - - - Tries to get the instance of currently - registered recipients for the input type. - - The type of message to send. - The resulting instance, if found. - Whether or not the required instance was found. - - - - Tries to get the instance of currently registered recipients - for the combination of types and . - - The type of message to send. - The type of token to identify what channel to use to send the message. - The resulting instance, if found. - Whether or not the required instance was found. - - - - Gets the instance of currently - registered recipients for the input type. - - The type of message to send. - A instance with the requested type arguments. - - - - Gets the instance of currently registered recipients - for the combination of types and . - - The type of message to send. - The type of token to identify what channel to use to send the message. - A instance with the requested type arguments. - - - - A mapping type representing a link to recipients and their view of handlers per communication channel. - - - This type is a specialization of for tokens. - - - - - Initializes a new instance of the class. - - The message type being used. - - - - Creates a new instance of the class. - - The type of message to receive. - A new instance. - - - - - - - A mapping type representing a link to recipients and their view of handlers per communication channel. - - The type of token to use to pick the messages to receive. - - This type is defined for simplicity and as a workaround for the lack of support for using type aliases - over open generic types in C# (using type aliases can only be used for concrete, closed types). - - - - - Initializes a new instance of the class. - - The message type being used. - - - - Creates a new instance of the class. - - The type of message to receive. - A new instance. - - - - - - - An interface for the and types which allows to retrieve - the type arguments from a given generic instance without having any prior knowledge about those arguments. - - - - - Gets the instance representing the current type arguments. - - - - - A simple type representing a recipient. - - - This type is used to enable fast indexing in each mapping dictionary, - since it acts as an external override for the and - methods for arbitrary objects, removing both - the virtual call and preventing instances overriding those methods in this context. - Using this type guarantees that all the equality operations are always only done - based on reference equality for each registered recipient, regardless of its type. - - - - - The registered recipient. - - - - - Initializes a new instance of the struct. - - The target recipient instance. - - - - - - - - - - - - - Throws an when trying to add a duplicate handler. - - - - - A class providing a reference implementation for the interface. - - - - This implementation uses weak references to track the registered - recipients, so it is not necessary to manually unregister them when they're no longer needed. - - - The type will automatically perform internal trimming when - full GC collections are invoked, so calling manually is not necessary to - ensure that on average the internal data structures are as trimmed and compact as possible. - - - - - - The map of currently registered recipients for all message types. - - - - - Initializes a new instance of the class. - - - - - Gets the default instance. - - - - - - - - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The type of token to use to pick the messages to receive. - The recipient that will receive the messages. - A token used to determine the receiving channel to use. - Thrown when trying to register the same message twice. - - This method is a variation of - that is specialized for recipients implementing . See more comments at the top of this type, as well as - within and in the types. - - - - - Registers a recipient for a given type of message. - - The type of message to receive. - The type of token to use to pick the messages to receive. - The recipient that will receive the messages. - A token used to determine the receiving channel to use. - The input instance to register, or null. - Thrown when trying to register the same message twice. - - - - - - - - - - - - - - - - Implements the broadcasting logic for . - - - - - - - This method is not a local function to avoid triggering multiple compilations due to TToken - potentially being a value type, which results in specialized code due to reified generics. This is - necessary to work around a Roslyn limitation that causes unnecessary type parameters in local - functions not to be discarded in the synthesized methods. Additionally, keeping this loop outside - of the EH block (the block) can help result in slightly better codegen. - - - - - - - - - - - Executes a cleanup without locking the current instance. This method has to be - invoked when a lock on has already been acquired. - - - - - Executes a cleanup without locking the current instance. This method has to be - invoked when a lock on has already been acquired. - - - - - Throws an when trying to add a duplicate handler. - - - - - A container for all shared configuration switches for the MVVM Toolkit. - - - - This type uses a very specific setup for configuration switches to ensure ILLink can work the best. - This mirrors the architecture of feature switches in the runtime as well, and it's needed so that - no static constructor is generated for the type. - - - For more info, see . - - - - - - The configuration property name for . - - - - - The backing field for . - - - - - Gets a value indicating whether or not support for should be enabled (defaults to ). - - - - - Gets a configuration value for a specified property. - - The property name to retrieve the value for. - The cached result for the target configuration value. - The default value for the feature switch, if not set. - The value of the specified configuration setting. - - - - Internal polyfill for . - - - - - Throws an if is . - - The reference type argument to validate as non-. - The name of the parameter with which corresponds. - - - - A specialized version for generic values. - - The type of values to check. - - This type is needed because if there had been a generic overload with a generic parameter, all calls - would have just been bound by that by the compiler instead of the overload. - - - - - Throws an if is . - - The reference type argument to validate as non-. - The name of the parameter with which corresponds. - - - - Throws an . - - The name of the parameter that failed validation. - - - - A specialized implementation to be used with messenger types. - - The type of keys in the dictionary. - The type of values in the dictionary. - - - - The index indicating the start of a free linked list. - - - - - The array of 1-based indices for the items stored in . - - - - - The array of currently stored key-value pairs (ie. the lists for each hash group). - - - - - A coefficient used to speed up retrieving the target bucket when doing lookups. - - - - - The current number of items stored in the map. - - - - - The 1-based index for the start of the free list within . - - - - - The total number of empty items. - - - - - Initializes a new instance of the class. - - - - - - - - - - - - - - Checks whether or not the dictionary contains a pair with a specified key. - - The key to look for. - Whether or not the key was present in the dictionary. - - - - Gets the value if present for the specified key. - - The key to look for. - The value found, otherwise . - Whether or not the key was present. - - - - - - - Gets the value for the specified key, or, if the key is not present, - adds an entry and returns the value by ref. This makes it possible to - add or update a value in a single look up operation. - - Key to look for. - Reference to the new or existing value. - - - - - - - Enumerator for . - - - - - The entries being enumerated. - - - - - The current enumeration index. - - - - - The current dictionary count. - - - - - Creates a new instance. - - The input dictionary to enumerate. - - - - - - - Gets the current key. - - - - - Gets the current value. - - - - - Gets the value for the specified key, or. - - Key to look for. - Reference to the existing value. - - - - Initializes the current instance. - - The target capacity. - - - - - Resizes the current dictionary to reduce the number of collisions - - - - - Gets a reference to a target bucket from an input hashcode. - - The input hashcode. - A reference to the target bucket. - - - - A type representing a map entry, ie. a node in a given list. - - - - - The cached hashcode for ; - - - - - 0-based index of next entry in chain: -1 means end of chain - also encodes whether this entry this.itself_ is part of the free list by changing sign and subtracting 3, - so -2 means end of free list, -3 means index 0 but on free list, -4 means index 1 but on free list, etc. - - - - - The key for the value in the current node. - - - - - The value in the current node, if present. - - - - - Throws an when trying to load an element with a missing key. - - - - - A helper class for . - - - - - Maximum prime smaller than the maximum array length. - - - - - An arbitrary prime factor used in . - - - - - Table of prime numbers to use as hash table sizes. - - - - - Checks whether a value is a prime. - - The value to check. - Whether or not is a prime. - - - - Gets the smallest prime bigger than a specified value. - - The target minimum value. - The new prime that was found. - - - - Returns size of hashtable to grow to. - - The previous table size. - The expanded table size. - - - - Returns approximate reciprocal of the divisor: ceil(2**64 / divisor). - - This should only be used on 64-bit. - - - - Performs a mod operation using the multiplier pre-computed with . - - This should only be used on 64-bit. - - - - A base interface masking instances and exposing non-generic functionalities. - - - - - Gets the count of entries in the dictionary. - - - - - Clears the current dictionary. - - - - - An interface providing key type contravariant and value type covariant access - to a instance. - - The contravariant type of keys in the dictionary. - The covariant type of values in the dictionary. - - - - Gets the value with the specified key. - - The key to look for. - The returned value. - Thrown if the key wasn't present. - - - - An interface providing key type contravariant access to a instance. - - The contravariant type of keys in the dictionary. - - - - Tries to remove a value with a specified key, if present. - - The key of the value to remove. - Whether or not the key was present. - - - - Schedules a callback roughly every gen 2 GC (you may see a Gen 0 an Gen 1 but only once). - Ported from https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Gen2GcCallback.cs. - - - - - The callback to invoke at each GC. - - - - - A weak to the target object to pass to . - - - - - Initializes a new instance of the class. - - The callback to invoke at each GC. - The target object to pass as argument to . - - - - Schedules a callback to be called on each GC until the target is collected. - - The callback to invoke at each GC. - The target object to pass as argument to . - - - - Finalizes an instance of the class. - This finalizer is re-registered with as long as - the target object is alive, which means it will be executed again every time a generation 2 - collection is triggered (as the instance itself would be moved to - that generation after surviving the generation 0 and 1 collections the first time). - - - - - A custom instance that is specifically optimized to be used - by . In particular, it offers zero-allocation enumeration of stored items. - - Tke key of items to store in the table. - The values to store in the table. - - - - Initial length of the table. Must be a power of two. - - - - - This lock protects all mutation of data in the table. Readers do not take this lock. - - - - - The actual storage for the table; swapped out as the table grows. - - - - - Initializes a new instance of the class. - - - - - - - - Tries to add a new pair to the table. - - The key to add. - The value to associate with key. - - - - - - - - - - Implements the functionality for under a lock. - - The input key. - The callback to use to create a new item. - The new item to store. - - - - - - - Provides an enumerator for the current instance. - - - - - Parent table, set to null when disposed. - - - - - Last index in the container that should be enumerated. - - - - - The current index into the container. - - - - - The current key, if available. - - - - - The current value, if available. - - - - - Initializes a new instance of the class. - - The input instance being enumerated. - - - - - - - - - - Gets the current key. - - - - - Gets the current value. - - - - - Worker for adding a new key/value pair. Will resize the container if it is full. - - The key for the new entry. - The value for the new entry. - - - - A single entry within a instance. - - - - - Holds key and value using a weak reference for the key and a strong reference for the - value that is traversed only if the key is reachable without going through the value. - - - - - Cached copy of key's hashcode. - - - - - Index of next entry, -1 if last. - - - - - Container holds the actual data for the table. A given instance of Container always has the same capacity. When we need - more capacity, we create a new Container, copy the old one into the new one, and discard the old one. This helps enable - lock-free reads from the table, as readers never need to deal with motion of entries due to rehashing. - - - - - The with which this container is associated. - - - - - buckets[hashcode & (buckets.Length - 1)] contains index of the first entry in bucket (-1 if empty). - - - - - The table entries containing the stored dependency handles - - - - - firstFreeEntry < entries.Length => table has capacity, entries grow from the bottom of the table. - - - - - Flag detects if OOM or other background exception threw us out of the lock. - - - - - Set to true when initially finalized - - - - - Used to ensure the next allocated container isn't finalized until this one is GC'd. - - - - - Initializes a new instance of the class. - - The input object associated with the current instance. - - - - Initializes a new instance of the class. - - The input object associated with the current instance. - The array of buckets. - The array of entries. - The index of the first free entry. - - - - Gets the capacity of the current container. - - - - - Gets the index of the first free entry. - - - - - Worker for adding a new key/value pair. Container must NOT be full. - - - - - Worker for finding a key/value pair. Must hold lock. - - - - - Returns -1 if not found (if key expires during FindEntry, this can be treated as "not found."). - Must hold lock, or be prepared to retry the search while holding lock. - - This method requires to be on the stack to be properly tracked. - - - - Gets the entry at the specified entry index. - - - - - Removes the specified key from the table, if it exists. - - - - - Removes a given entry at a specified index. - - The index of the entry to remove. - - - - Resize, and scrub expired keys off bucket lists. Must hold . - - - is less than entries.Length on exit, that is, the table has at least one free entry. - - - - - Creates a new of a specified size with the current items. - - The new requested size. - The new instance with the requested size. - - - - Verifies that the current instance is valid. - - Thrown if the current instance is invalid. - - - - Finalizes the current instance. - - - - + + + + CommunityToolkit.Mvvm + + + + + A helper type for the type. + + + + + The cached for + + + + + An interface for a grouped collection of items. + + + + + Gets the key for the current collection. + + + + + Gets the number of items currently in the grouped collection. + + + + + Gets the element at the specified index in the current collection. + + The zero-based index of the element to get. + The element at the specified index in the read-only list. + Thrown if the index is out of range. + + + + An interface for a grouped collection of items. + + The type of the group key. + The type of elements in the group. + + + + Gets the element at the specified index in the current collection. + + The zero-based index of the element to get. + The element at the specified index in the read-only list. + Thrown if the index is out of range. + + + + An interface for a grouped collection of items. + + The type of the group key. + + + + Gets the key for the current collection. + + + + + The extensions methods to simplify the usage of . + + + + + Returns the first group with key. + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group to query. + The first group matching . + Thrown if or are . + The target group does not exist. + + + + Returns the first group with key or if not found. + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group to query. + The first group matching or . + Thrown if or are . + + + + Adds a key-value item into a target . + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group to add. + The added . + Thrown if or are . + + + + Adds a key-collection item into a target . + + The type of the group key. + The type of the items in the collection. + The source instance. + The group of items to add. + The added . + Thrown if or are . + + + + Adds a key-collection item into a target . + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group where will be added. + The collection to add. + The added . + Thrown if , or are . + + + + Adds a key-value item into a target . + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group to add. + The added . + Thrown if or are . + + + + Adds a key-value item into a target . + + The type of the group key. + The type of the items in the collection. + The source instance. + The group of items to add. + The added . + Thrown if or are . + + + + Adds a key-value item into a target . + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group where will be added. + The collection to add. + The added . + Thrown if , or are . + + + + Adds a key-value item into a target . + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group to add. + The instance to insert at the right position. + The added . + Thrown if , or are . + + + + Adds a key-value item into a target . + + The type of the group key. + The type of the items in the collection. + The source instance. + The group of items to add. + The instance to insert at the right position. + The added . + Thrown if , or are . + + + + Adds a key-value item into a target . + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group where will be added. + The instance to insert at the right position. + The collection to add. + The added . + Thrown if , , or are . + + + + Add into the first group with key. + If the group does not exist, it will be added. + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group where the should be added. + The item to add. + The instance of the which will receive the value. It will either be an existing group or a new group. + Thrown if or are . + + + + Insert into the first group with key. + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group where to insert . + The item to add. + The instance of the which will receive the value. + Thrown if or are . + + + + Insert into the first group with key. + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group where to insert . + The instance to compare keys. + The item to add. + The instance to compare elements. + The instance of the which will receive the value. + Thrown if , , or are . + + + + Remove the first occurrence of the group with from the grouped collection. + It will not do anything if the group does not exist. + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group to remove. + Thrown if or are . + + + + Remove the first from the first group with from the grouped collection. + It will not do anything if the group or the item does not exist. + + The type of the group key. + The type of the items in the collection. + The source instance. + The key of the group where the should be removed. + The item to remove. + If true (default value), the group will be removed once it becomes empty. + Thrown if or are . + + + + An observable list of observable groups. + + The type of the group keys. + The type of elements in the collection. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The initial data to add in the grouped collection. + Thrown if is . + + + + + + + Tries to get the underlying instance, if present. + + The resulting , if one was in use. + Whether or not a instance has been found. + + + + + + + + + + An observable group. + It associates a to an . + + The type of the group key. + The type of elements in the group. + + + + Initializes a new instance of the class. + + The key for the group. + Thrown if is . + + + + Initializes a new instance of the class. + + The grouping to fill the group. + Thrown if is . + + + + Initializes a new instance of the class. + + The key for the group. + The initial collection of data to add to the group. + Thrown if or are . + + + + Gets or sets the key of the group. + + Thrown if is . + + + + Tries to get the underlying instance, if present. + + The resulting , if one was in use. + Whether or not a instance has been found. + + + + + + + + + + A read-only list of groups. + + The type of the group keys. + The type of elements in the collection. + + + + Initializes a new instance of the class. + + The source collection to wrap. + Thrown if is . + + + + Initializes a new instance of the class. + + The source collection to wrap. + Thrown if is . + + + + + + + + + + + + + Forwards the event whenever it is raised by the wrapped collection. + + The wrapped collection (an of instance). + The arguments. + Thrown if a range operation is requested. + + + + Returns the first group with key or if not found. + + The key of the group to query (assumed not to be ). + The first group matching . + + + + A read-only observable group. It associates a to a . + + The type of the group key. + The type of elements in the group. + + + + Initializes a new instance of the class. + + The key of the group. + The collection of items to add in the group. + Thrown if or are . + + + + Initializes a new instance of the class. + + The to wrap. + Thrown if is . + + + + + + + + + + + + + An attribute that indicates that a given type should implement the interface and + have minimal built-in functionality to support it. This includes exposing the necessary event and having two methods + to raise it that mirror and + . For more extensive support, use . + + This attribute can be used as follows: + + [INotifyPropertyChanged] + partial class MyViewModel : SomeOtherClass + { + // Other members here... + } + + + + + + + Gets or sets a value indicating whether or not to also generate all the additional helper methods that are found + in as well (eg. . + If set to , only the event and + the two overloads will be generated. + The default value is . + + + + + An attribute that can be used to support properties in generated properties. When this attribute is + used, the generated property setter will also call for the properties specified + in the attribute data, causing the validation logic for the command to be executed again. This can be useful to keep the code compact + when there are one or more dependent commands that should also be notified when a property is updated. If this attribute is used in + a field without , it is ignored (just like ). + + In order to use this attribute, the target property has to implement the interface. + + + This attribute can be used as follows: + + partial class MyViewModel : ObservableObject + { + [ObservableProperty] + [NotifyCanExecuteChangedFor(nameof(GreetUserCommand))] + private string name; + + public IRelayCommand GreetUserCommand { get; } + } + + + And with this, code analogous to this will be generated: + + partial class MyViewModel + { + public string Name + { + get => name; + set + { + if (SetProperty(ref name, value)) + { + GreetUserCommand.NotifyCanExecuteChanged(); + } + } + } + } + + + + + + Initializes a new instance of the class. + + The name of the command to also notify when the annotated property changes. + + + + Initializes a new instance of the class. + + The name of the property to also notify when the annotated property changes. + + The other command names to also notify when the annotated property changes. This parameter can optionally + be used to indicate a series of dependent commands from the same attribute, to keep the code more compact. + + + + + Gets the command names to also notify when the annotated property changes. + + + + + An attribute that can be used to support in generated properties, when applied to + fields contained in a type that is inheriting from and using any validation attributes. + When this attribute is used, the generated property setter will also call . + This allows generated properties to opt-in into validation behavior without having to fallback into a full explicit observable property. + + This attribute can be used as follows: + + partial class MyViewModel : ObservableValidator + { + [ObservableProperty] + [NotifyDataErrorInfo] + [Required] + [MinLength(2)] + private string username; + } + + + And with this, code analogous to this will be generated: + + partial class MyViewModel + { + [Required] + [MinLength(2)] + public string Username + { + get => username; + set => SetProperty(ref username, value, validate: true); + } + } + + + + + + An attribute that can be used to support in generated properties. When this attribute is + used, the generated property setter will also call (or the equivalent + method in the target class) for the properties specified in the attribute data. This can be useful to keep the code compact when + there are one or more dependent properties that should also be reported as updated when the value of the annotated observable + property is changed. If this attribute is used in a field without , it is ignored. + + In order to use this attribute, the containing type has to implement the interface + and expose a method with the same signature as . If the containing + type also implements the interface and exposes a method with the same signature as + , then this method will be invoked as well by the property setter. + + + This attribute can be used as follows: + + partial class MyViewModel : ObservableObject + { + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(FullName))] + private string name; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(FullName))] + private string surname; + + public string FullName => $"{Name} {Surname}"; + } + + + And with this, code analogous to this will be generated: + + partial class MyViewModel + { + public string Name + { + get => name; + set + { + if (!EqualityComparer<string>.Default.Equals(name, value)) + { + OnPropertyChanging(nameof(Name)); + OnPropertyChanged(nameof(FullName)); + + name = value; + + OnPropertyChanged(nameof(Name)); + OnPropertyChanged(nameof(FullName)); + } + } + } + + public string Surname + { + get => surname; + set + { + if (!EqualityComparer<string>.Default.Equals(name, value)) + { + OnPropertyChanging(nameof(Surname)); + OnPropertyChanged(nameof(FullName)); + + surname = value; + + OnPropertyChanged(nameof(Surname)); + OnPropertyChanged(nameof(FullName)); + } + } + } + } + + + + + + Initializes a new instance of the class. + + The name of the property to also notify when the annotated property changes. + + + + Initializes a new instance of the class. + + The name of the property to also notify when the annotated property changes. + + The other property names to also notify when the annotated property changes. This parameter can optionally + be used to indicate a series of dependent properties from the same attribute, to keep the code more compact. + + + + + Gets the property names to also notify when the annotated property changes. + + + + + An attribute that can be used to support in generated properties, when applied to fields + contained in a type that is either inheriting from , or annotated with . + When this attribute is used, the generated property setter will also call . + This allows generated properties to opt-in into broadcasting behavior without having to fallback into a full explicit observable property. + + This attribute can be used as follows: + + partial class MyViewModel : ObservableRecipient + { + [ObservableProperty] + [NotifyPropertyChangedRecipients] + private string username; + } + + + + And with this, code analogous to this will be generated: + + partial class MyViewModel + { + public string Username + { + get => username; + set => SetProperty(ref username, value, broadcast: true); + } + } + + + + This attribute can also be added to a class, and if so it will affect all generated properties in that type and inherited types. + + + + + + An attribute that indicates that a given type should have all the members from + generated into it, as well as the and + interfaces. This can be useful when you want the same functionality from into a class + that already inherits from another one (since C# doesn't support multiple inheritance). This attribute will trigger + the source generator to just create the same APIs directly into the decorated class. + + This attribute can be used as follows: + + [ObservableObject] + partial class MyViewModel : SomeOtherClass + { + // Other members here... + } + + + And with this, the same APIs from will be available on this type as well. + + + + + An attribute that indicates that a given field should be wrapped by a generated observable property. + In order to use this attribute, the containing type has to inherit from , or it + must be using or . + If the containing type also implements the (that is, if it either inherits from + or is using ), then the generated code will + also invoke to signal that event. + + This attribute can be used as follows: + + partial class MyViewModel : ObservableObject + { + [ObservableProperty] + private string name; + + [ObservableProperty] + private bool isEnabled; + } + + + And with this, code analogous to this will be generated: + + partial class MyViewModel + { + public string Name + { + get => name; + set => SetProperty(ref name, value); + } + + public bool IsEnabled + { + get => isEnabled; + set => SetProperty(ref isEnabled, value); + } + } + + + + The generated properties will automatically use the UpperCamelCase format for their names, + which will be derived from the field names. The generator can also recognize fields using either + the _lowerCamel or m_lowerCamel naming scheme. Otherwise, the first character in the + source field name will be converted to uppercase (eg. isEnabled to IsEnabled). + + + + + An attribute that indicates that a given type should have all the members from + generated into it. This can be useful when you want the same functionality from into + a class that already inherits from another one (since C# doesn't support multiple inheritance). This attribute will trigger + the source generator to just create the same APIs directly into the decorated class. For instance, this attribute can be + used to easily combine the functionality from both and , + by using as the base class and adding this attribute to the declared type. + + This attribute can be used as follows: + + [ObservableRecipient] + partial class MyViewModel : ObservableValidator + { + // Other members here... + } + + + And with this, the same APIs from will be available on this type as well. + + To avoid conflicts with other APIs in types where the new members are being generated, constructors are only generated when the annotated + type doesn't have any explicit constructors being declared. If that is the case, the same constructors from + are emitted, with the accessibility adapted to that of the annotated type. Otherwise, they are skipped, so the type being annotated has the + responsibility of properly initializing the property. Additionally, if the annotated type inherits + from , the overloads will be skipped + as well, as they would conflict with the methods. + + + + In order to work, needs to be applied to a type that inherits from + (either directly or indirectly), or to one decorated with . + This is because the methods rely on some of the inherited members to work. + If this condition is not met, the code will fail to build. + + + + + A base class for objects of which the properties must be observable. + + + + + + + + + + + Raises the event. + + The input instance. + Thrown if is . + + + + Raises the event. + + The input instance. + Thrown if is . + + + + Raises the event. + + (optional) The name of the property that changed. + + + + Raises the event. + + (optional) The name of the property that changed. + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with the new + value, then raises the event. + + The type of the property that changed. + The field storing the property's value. + The property's value after the change occurred. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + The and events are not raised + if the current and new value for the target property are the same. + + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with the new + value, then raises the event. + See additional notes about this overload in . + + The type of the property that changed. + The field storing the property's value. + The property's value after the change occurred. + The instance to use to compare the input values. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if is . + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with the new + value, then raises the event. + This overload is much less efficient than and it + should only be used when the former is not viable (eg. when the target property being + updated does not directly expose a backing field that can be passed by reference). + For performance reasons, it is recommended to use a stateful callback if possible through + the whenever possible + instead of this overload, as that will allow the C# compiler to cache the input callback and + reduce the memory allocations. More info on that overload are available in the related XML + docs. This overload is here for completeness and in cases where that is not applicable. + + The type of the property that changed. + The current property value. + The property's value after the change occurred. + A callback to invoke to update the property value. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + The and events are not raised + if the current and new value for the target property are the same. + + Thrown if is . + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with the new + value, then raises the event. + See additional notes about this overload in . + + The type of the property that changed. + The current property value. + The property's value after the change occurred. + The instance to use to compare the input values. + A callback to invoke to update the property value. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if or are . + + + + Compares the current and new values for a given nested property. If the value has changed, + raises the event, updates the property and then raises the + event. The behavior mirrors that of , + with the difference being that this method is used to relay properties from a wrapped model in the + current instance. This type is useful when creating wrapping, bindable objects that operate over + models that lack support for notification (eg. for CRUD operations). + Suppose we have this model (eg. for a database row in a table): + + public class Person + { + public string Name { get; set; } + } + + We can then use a property to wrap instances of this type into our observable model (which supports + notifications), injecting the notification to the properties of that model, like so: + + public class BindablePerson : ObservableObject + { + public Model { get; } + + public BindablePerson(Person model) + { + Model = model; + } + + public string Name + { + get => Model.Name; + set => Set(Model.Name, value, Model, (model, name) => model.Name = name); + } + } + + This way we can then use the wrapping object in our application, and all those "proxy" properties will + also raise notifications when changed. Note that this method is not meant to be a replacement for + , and it should only be used when relaying properties to a model that + doesn't support notifications, and only if you can't implement notifications to that model directly (eg. by having + it inherit from ). The syntax relies on passing the target model and a stateless callback + to allow the C# compiler to cache the function, which results in much better performance and no memory usage. + + The type of model whose property (or field) to set. + The type of property (or field) to set. + The current property value. + The property's value after the change occurred. + The model containing the property being updated. + The callback to invoke to set the target property value, if a change has occurred. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + The and events are not + raised if the current and new value for the target property are the same. + + Thrown if or are . + + + + Compares the current and new values for a given nested property. If the value has changed, + raises the event, updates the property and then raises the + event. The behavior mirrors that of , + with the difference being that this method is used to relay properties from a wrapped model in the + current instance. See additional notes about this overload in . + + The type of model whose property (or field) to set. + The type of property (or field) to set. + The current property value. + The property's value after the change occurred. + The instance to use to compare the input values. + The model containing the property being updated. + The callback to invoke to set the target property value, if a change has occurred. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if , or are . + + + + Compares the current and new values for a given field (which should be the backing + field for a property). If the value has changed, raises the + event, updates the field and then raises the event. + The behavior mirrors that of , with the difference being that + this method will also monitor the new value of the property (a generic ) and will also + raise the again for the target property when it completes. + This can be used to update bindings observing that or any of its properties. + This method and its overload specifically rely on the type, which needs + to be used in the backing field for the target property. The field doesn't need to be + initialized, as this method will take care of doing that automatically. The + type also includes an implicit operator, so it can be assigned to any instance directly. + Here is a sample property declaration using this method: + + private TaskNotifier myTask; + + public Task MyTask + { + get => myTask; + private set => SetAndNotifyOnCompletion(ref myTask, value); + } + + + The field notifier to modify. + The property's value after the change occurred. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + The and events are not raised if the current + and new value for the target property are the same. The return value being only + indicates that the new value being assigned to is different than the previous one, + and it does not mean the new instance passed as argument is in any particular state. + + + + + Compares the current and new values for a given field (which should be the backing + field for a property). If the value has changed, raises the + event, updates the field and then raises the event. + This method is just like , + with the difference being an extra parameter with a callback being invoked + either immediately, if the new task has already completed or is , or upon completion. + + The field notifier to modify. + The property's value after the change occurred. + A callback to invoke to update the property value. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + The and events are not raised + if the current and new value for the target property are the same. + + Thrown if is . + + + + Compares the current and new values for a given field (which should be the backing + field for a property). If the value has changed, raises the + event, updates the field and then raises the event. + The behavior mirrors that of , with the difference being that + this method will also monitor the new value of the property (a generic ) and will also + raise the again for the target property when it completes. + This can be used to update bindings observing that or any of its properties. + This method and its overload specifically rely on the type, which needs + to be used in the backing field for the target property. The field doesn't need to be + initialized, as this method will take care of doing that automatically. The + type also includes an implicit operator, so it can be assigned to any instance directly. + Here is a sample property declaration using this method: + + private TaskNotifier<int> myTask; + + public Task<int> MyTask + { + get => myTask; + private set => SetAndNotifyOnCompletion(ref myTask, value); + } + + + The type of result for the to set and monitor. + The field notifier to modify. + The property's value after the change occurred. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + The and events are not raised if the current + and new value for the target property are the same. The return value being only + indicates that the new value being assigned to is different than the previous one, + and it does not mean the new instance passed as argument is in any particular state. + + + + + Compares the current and new values for a given field (which should be the backing + field for a property). If the value has changed, raises the + event, updates the field and then raises the event. + This method is just like , + with the difference being an extra parameter with a callback being invoked + either immediately, if the new task has already completed or is , or upon completion. + + The type of result for the to set and monitor. + The field notifier to modify. + The property's value after the change occurred. + A callback to invoke to update the property value. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + The and events are not raised + if the current and new value for the target property are the same. + + Thrown if is . + + + + Implements the notification logic for the related methods. + + The type of to set and monitor. + The field notifier. + The property's value after the change occurred. + (optional) A callback to invoke to update the property value. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + + + An interface for task notifiers of a specified type. + + The type of value to store. + + + + Gets or sets the wrapped value. + + + + + A wrapping class that can hold a value. + + + + + Initializes a new instance of the class. + + + + + + + + Unwraps the value stored in the current instance. + + The input instance. + + + + A wrapping class that can hold a value. + + The type of value for the wrapped instance. + + + + Initializes a new instance of the class. + + + + + + + + Unwraps the value stored in the current instance. + + The input instance. + + + + A base class for observable objects that also acts as recipients for messages. This class is an extension of + which also provides built-in support to use the type. + + + + + Initializes a new instance of the class. + + + This constructor will produce an instance that will use the instance + to perform requested operations. It will also be available locally through the property. + + + + + Initializes a new instance of the class. + + The instance to use to send messages. + Thrown if is . + + + + Gets the instance in use. + + + + + Gets or sets a value indicating whether the current view model is currently active. + + + + + Invoked whenever the property is set to . + Use this method to register to messages and do other initialization for this instance. + + + The base implementation registers all messages for this recipients that have been declared + explicitly through the interface, using the default channel. + For more details on how this works, see the method. + If you need more fine tuned control, want to register messages individually or just prefer + the lambda-style syntax for message registration, override this method and register manually. + + + + + Invoked whenever the property is set to . + Use this method to unregister from messages and do general cleanup for this instance. + + + The base implementation unregisters all messages for this recipient. It does so by + invoking , which removes all registered + handlers for a given subscriber, regardless of what token was used to register them. + That is, all registered handlers across all subscription channels will be removed. + + + + + Broadcasts a with the specified + parameters, without using any particular token (so using the default channel). + + The type of the property that changed. + The value of the property before it changed. + The value of the property after it changed. + The name of the property that changed. + + You should override this method if you wish to customize the channel being + used to send the message (eg. if you need to use a specific token for the channel). + + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with + the new value, then raises the event. + + The type of the property that changed. + The field storing the property's value. + The property's value after the change occurred. + If , will also be invoked. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + This method is just like , just with the addition + of the parameter. As such, following the behavior of the base method, + the and events + are not raised if the current and new value for the target property are the same. + + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with + the new value, then raises the event. + See additional notes about this overload in . + + The type of the property that changed. + The field storing the property's value. + The property's value after the change occurred. + The instance to use to compare the input values. + If , will also be invoked. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if is . + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with + the new value, then raises the event. Similarly to + the method, this overload should only be + used when can't be used directly. + + The type of the property that changed. + The current property value. + The property's value after the change occurred. + A callback to invoke to update the property value. + If , will also be invoked. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + This method is just like , just with the addition + of the parameter. As such, following the behavior of the base method, + the and events + are not raised if the current and new value for the target property are the same. + + Thrown if is . + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with + the new value, then raises the event. + See additional notes about this overload in . + + The type of the property that changed. + The current property value. + The property's value after the change occurred. + The instance to use to compare the input values. + A callback to invoke to update the property value. + If , will also be invoked. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if or are . + + + + Compares the current and new values for a given nested property. If the value has changed, + raises the event, updates the property and then raises the + event. The behavior mirrors that of + , with the difference being that this + method is used to relay properties from a wrapped model in the current instance. For more info, see the docs for + . + + The type of model whose property (or field) to set. + The type of property (or field) to set. + The current property value. + The property's value after the change occurred. + The model + The callback to invoke to set the target property value, if a change has occurred. + If , will also be invoked. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if or are . + + + + Compares the current and new values for a given nested property. If the value has changed, + raises the event, updates the property and then raises the + event. The behavior mirrors that of + , + with the difference being that this method is used to relay properties from a wrapped model in the + current instance. For more info, see the docs for + . + + The type of model whose property (or field) to set. + The type of property (or field) to set. + The current property value. + The property's value after the change occurred. + The instance to use to compare the input values. + The model + The callback to invoke to set the target property value, if a change has occurred. + If , will also be invoked. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if , or are . + + + + A base class for objects implementing the interface. This class + also inherits from , so it can be used for observable items too. + + + + + The instance used to track compiled delegates to validate entities. + + + + + The instance used to track display names for properties to validate. + + + This is necessary because we want to reuse the same instance for all validations, but + with the same behavior with respect to formatted names that new instances would have provided. The issue is that the + property is not refreshed when we set , + so we need to replicate the same logic to retrieve the right display name for properties to validate and update that + property manually right before passing the context to and proceed with the normal functionality. + + + + + The cached for . + + + + + The instance currently in use. + + + + + The instance used to store previous validation results. + + + + + Indicates the total number of properties with errors (not total errors). + This is used to allow to operate in O(1) time, as it can just + check whether this value is not 0 instead of having to traverse . + + + + + + + + Initializes a new instance of the class. + This constructor will create a new that will + be used to validate all properties, which will reference the current instance + and no additional services or validation properties and settings. + + + + + Initializes a new instance of the class. + This constructor will create a new that will + be used to validate all properties, which will reference the current instance. + + A set of key/value pairs to make available to consumers. + + + + Initializes a new instance of the class. + This constructor will create a new that will + be used to validate all properties, which will reference the current instance. + + An instance to make available during validation. + A set of key/value pairs to make available to consumers. + + + + Initializes a new instance of the class. + This constructor will store the input instance, + and it will use it to validate all properties for the current viewmodel. + + + The instance to use to validate properties. + + This instance will be passed to all + calls executed by the current viewmodel, and its property will be updated every time + before the call is made to set the name of the property being validated. The property name will not be reset after that, so the + value of will always indicate the name of the last property that was validated, if any. + + + Thrown if is . + + + + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with + the new value, then raises the event. + + The type of the property that changed. + The field storing the property's value. + The property's value after the change occurred. + If , will also be validated. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + This method is just like , just with the addition + of the parameter. If that is set to , the new value will be + validated and will be raised if needed. Following the behavior of the base method, + the and events + are not raised if the current and new value for the target property are the same. + + Thrown if is . + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with + the new value, then raises the event. + See additional notes about this overload in . + + The type of the property that changed. + The field storing the property's value. + The property's value after the change occurred. + The instance to use to compare the input values. + If , will also be validated. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if or are . + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with + the new value, then raises the event. Similarly to + the method, this overload should only be + used when can't be used directly. + + The type of the property that changed. + The current property value. + The property's value after the change occurred. + A callback to invoke to update the property value. + If , will also be validated. + (optional) The name of the property that changed. + if the property was changed, otherwise. + + This method is just like , just with the addition + of the parameter. As such, following the behavior of the base method, + the and events + are not raised if the current and new value for the target property are the same. + + Thrown if or are . + + + + Compares the current and new values for a given property. If the value has changed, + raises the event, updates the property with + the new value, then raises the event. + See additional notes about this overload in . + + The type of the property that changed. + The current property value. + The property's value after the change occurred. + The instance to use to compare the input values. + A callback to invoke to update the property value. + If , will also be validated. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if , or are . + + + + Compares the current and new values for a given nested property. If the value has changed, + raises the event, updates the property and then raises the + event. The behavior mirrors that of + , with the difference being that this + method is used to relay properties from a wrapped model in the current instance. For more info, see the docs for + . + + The type of model whose property (or field) to set. + The type of property (or field) to set. + The current property value. + The property's value after the change occurred. + The model + The callback to invoke to set the target property value, if a change has occurred. + If , will also be validated. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if , or are . + + + + Compares the current and new values for a given nested property. If the value has changed, + raises the event, updates the property and then raises the + event. The behavior mirrors that of + , + with the difference being that this method is used to relay properties from a wrapped model in the + current instance. For more info, see the docs for + . + + The type of model whose property (or field) to set. + The type of property (or field) to set. + The current property value. + The property's value after the change occurred. + The instance to use to compare the input values. + The model + The callback to invoke to set the target property value, if a change has occurred. + If , will also be validated. + (optional) The name of the property that changed. + if the property was changed, otherwise. + Thrown if , , or are . + + + + Tries to validate a new value for a specified property. If the validation is successful, + is called, otherwise no state change is performed. + + The type of the property that changed. + The field storing the property's value. + The property's value after the change occurred. + The resulting validation errors, if any. + (optional) The name of the property that changed. + Whether the validation was successful and the property value changed as well. + Thrown if is . + + + + Tries to validate a new value for a specified property. If the validation is successful, + is called, otherwise no state change is performed. + + The type of the property that changed. + The field storing the property's value. + The property's value after the change occurred. + The instance to use to compare the input values. + The resulting validation errors, if any. + (optional) The name of the property that changed. + Whether the validation was successful and the property value changed as well. + Thrown if or are . + + + + Tries to validate a new value for a specified property. If the validation is successful, + is called, otherwise no state change is performed. + + The type of the property that changed. + The current property value. + The property's value after the change occurred. + A callback to invoke to update the property value. + The resulting validation errors, if any. + (optional) The name of the property that changed. + Whether the validation was successful and the property value changed as well. + Thrown if or are . + + + + Tries to validate a new value for a specified property. If the validation is successful, + is called, otherwise no state change is performed. + + The type of the property that changed. + The current property value. + The property's value after the change occurred. + The instance to use to compare the input values. + A callback to invoke to update the property value. + The resulting validation errors, if any. + (optional) The name of the property that changed. + Whether the validation was successful and the property value changed as well. + Thrown if , or are . + + + + Tries to validate a new value for a specified property. If the validation is successful, + is called, otherwise no state change is performed. + + The type of model whose property (or field) to set. + The type of property (or field) to set. + The current property value. + The property's value after the change occurred. + The model + The callback to invoke to set the target property value, if a change has occurred. + The resulting validation errors, if any. + (optional) The name of the property that changed. + Whether the validation was successful and the property value changed as well. + Thrown if , or are . + + + + Tries to validate a new value for a specified property. If the validation is successful, + is called, otherwise no state change is performed. + + The type of model whose property (or field) to set. + The type of property (or field) to set. + The current property value. + The property's value after the change occurred. + The instance to use to compare the input values. + The model + The callback to invoke to set the target property value, if a change has occurred. + The resulting validation errors, if any. + (optional) The name of the property that changed. + Whether the validation was successful and the property value changed as well. + Thrown if , , or are . + + + + Clears the validation errors for a specified property or for the entire entity. + + + The name of the property to clear validation errors for. + If a or empty name is used, all entity-level errors will be cleared. + + + + + + + + + + + Validates all the properties in the current instance and updates all the tracked errors. + If any changes are detected, the event will be raised. + + + Only public instance properties (excluding custom indexers) that have at least one + applied to them will be validated. All other + members in the current instance will be ignored. None of the processed properties + will be modified - they will only be used to retrieve their values and validate them. + + + + + Validates a property with a specified name and a given input value. + If any changes are detected, the event will be raised. + + The value to test for the specified property. + The name of the property to validate. + Thrown when is . + + + + Tries to validate a property with a specified name and a given input value, and returns + the computed errors, if any. If the property is valid, it is assumed that its value is + about to be set in the current object. Otherwise, no observable local state is modified. + + The value to test for the specified property. + The name of the property to validate. + The resulting validation errors, if any. + + + + Clears all the current errors for the entire entity. + + + + + Clears all the current errors for a target property. + + The name of the property to clear errors for. + + + + Gets the display name for a given property. It could be a custom name or just the property name. + + The target property name being validated. + The display name for the property. + + + + An internal helper to support the source generator APIs related to . + This type is not intended to be used directly by user code. + + + + + Invokes externally on a target instance. + + The target instance. + The value to test for the specified property. + The name of the property to validate. + + + + An internal helper used to support and generated code from its template. + This type is not intended to be used directly by user code. + + + + + Gets an awaitable object that skips end validation. + + The input to get the awaitable for. + A object wrapping . + + + + A custom task awaitable object that skips end validation. + + + + + The wrapped instance to create an awaiter for. + + + + + Creates a new instance with the specified parameters. + + The wrapped instance to create an awaiter for. + + + + Gets an instance for the current underlying task. + + An instance for the current underlying task. + + + + An awaiter object for . + + + + + The underlying instance. + + + + + Creates a new instance with the specified parameters. + + The wrapped instance to create an awaiter for. + + + + Gets whether the operation has completed or not. + + This property is intended for compiler user rather than use directly in code. + + + + Ends the await operation. + + This method is intended for compiler user rather than use directly in code. + + + + + + + + + + A type that facilitates the use of the type. + The provides the ability to configure services in a singleton, thread-safe + service provider instance, which can then be used to resolve service instances. + The first step to use this feature is to declare some services, for instance: + + public interface ILogger + { + void Log(string text); + } + + + public class ConsoleLogger : ILogger + { + void Log(string text) => Console.WriteLine(text); + } + + Then the services configuration should then be done at startup, by calling the + method and passing an instance with the services to use. That instance can + be from any library offering dependency injection functionality, such as Microsoft.Extensions.DependencyInjection. + For instance, using that library, can be used as follows in this example: + + Ioc.Default.ConfigureServices( + new ServiceCollection() + .AddSingleton<ILogger, Logger>() + .BuildServiceProvider()); + + Finally, you can use the instance (which implements ) + to retrieve the service instances from anywhere in your application, by doing as follows: + + Ioc.Default.GetService<ILogger>().Log("Hello world!"); + + + + + + Gets the default instance. + + + + + The instance to use, if initialized. + + + + + + + + Tries to resolve an instance of a specified service type. + + The type of service to resolve. + An instance of the specified service, or . + Thrown if the current instance has not been initialized. + + + + Resolves an instance of a specified service type. + + The type of service to resolve. + An instance of the specified service, or . + + Thrown if the current instance has not been initialized, or if the + requested service type was not registered in the service provider currently in use. + + + + + Initializes the shared instance. + + The input instance to use. + Thrown if is . + + + + Throws an when the property is used before initialization. + + + + + Throws an when the property is missing a type registration. + + + + + Throws an when a configuration is attempted more than once. + + + + + A command that mirrors the functionality of , with the addition of + accepting a returning a as the execute + action, and providing an property that notifies changes when + is invoked and when the returned completes. + + + + + The cached for . + + + + + The cached for . + + + + + The cached for . + + + + + The cached for . + + + + + The to invoke when is used. + + + + + The cancelable to invoke when is used. + + Only one between this and is not . + + + + The optional action to invoke when is used. + + + + + The options being set for the current command. + + + + + The instance to use to cancel . + + This is only used when is not . + + + + + + + + + + Initializes a new instance of the class. + + The execution logic. + Thrown if is . + + + + Initializes a new instance of the class. + + The execution logic. + The options to use to configure the async command. + Thrown if is . + + + + Initializes a new instance of the class. + + The cancelable execution logic. + Thrown if is . + + + + Initializes a new instance of the class. + + The cancelable execution logic. + The options to use to configure the async command. + Thrown if is . + + + + Initializes a new instance of the class. + + The execution logic. + The execution status logic. + Thrown if or are . + + + + Initializes a new instance of the class. + + The execution logic. + The execution status logic. + The options to use to configure the async command. + Thrown if or are . + + + + Initializes a new instance of the class. + + The cancelable execution logic. + The execution status logic. + Thrown if or are . + + + + Initializes a new instance of the class. + + The cancelable execution logic. + The execution status logic. + The options to use to configure the async command. + Thrown if or are . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Awaits an input and throws an exception on the calling context, if the task fails. + + The input instance to await. + + + + Options to customize the behavior of and instances. + + + + + No option is specified. The and types will use their default behavior: + + Concurrent execution is disallowed: a command is disabled if there is a pending asynchronous execution running. + + + Exceptions are thrown on the calling context: calling will await the + returned for the operation, and propagate the exception on the calling context. + + This behavior is consistent with synchronous commands, where exceptions in behave the same. + + + + + + + Concurrent executions are allowed. This option makes it so that the same command can be invoked concurrently multiple times. + + Note that additional considerations should be taken into account in this case: + + If the command supports cancellation, previous invocations will automatically be canceled if a new one is started. + The property will always represent the operation that was started last. + + + + + + + Exceptions are not thrown on the calling context, and are propagated to instead. + + This affects how calls to behave. When this option is used, if an operation fails, that exception will not + be rethrown on the calling context (as it is not awaited there). Instead, it will flow to . + + + This option enables more advanced scenarios, where the property can be used to inspect the state of an operation + that was queued. That is, even if the operation failed or was canceled, the details of that can be retrieved at a later time by accessing this property. + + + + + + A generic command that provides a more specific version of . + + The type of parameter being passed as input to the callbacks. + + + + The to invoke when is used. + + + + + The cancelable to invoke when is used. + + + + + The optional action to invoke when is used. + + + + + The options being set for the current command. + + + + + The instance to use to cancel . + + + + + + + + + + + Initializes a new instance of the class. + + The execution logic. + See notes in . + Thrown if is . + + + + Initializes a new instance of the class. + + The execution logic. + The options to use to configure the async command. + See notes in . + Thrown if is . + + + + Initializes a new instance of the class. + + The cancelable execution logic. + See notes in . + Thrown if is . + + + + Initializes a new instance of the class. + + The cancelable execution logic. + The options to use to configure the async command. + See notes in . + Thrown if is . + + + + Initializes a new instance of the class. + + The execution logic. + The execution status logic. + See notes in . + Thrown if or are . + + + + Initializes a new instance of the class. + + The execution logic. + The execution status logic. + The options to use to configure the async command. + See notes in . + Thrown if or are . + + + + Initializes a new instance of the class. + + The cancelable execution logic. + The execution status logic. + See notes in . + Thrown if or are . + + + + Initializes a new instance of the class. + + The cancelable execution logic. + The execution status logic. + The options to use to configure the async command. + See notes in . + Thrown if or are . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An attribute that can be used to automatically generate properties from declared methods. When this attribute + is used to decorate a method, a generator will create a command property with the corresponding interface + depending on the signature of the method. If an invalid method signature is used, the generator will report an error. + + In order to use this attribute, the containing type doesn't need to implement any interfaces. The generated properties will be lazily + assigned but their value will never change, so there is no need to support property change notifications or other additional functionality. + + + This attribute can be used as follows: + + partial class MyViewModel + { + [RelayCommand] + private void GreetUser(User? user) + { + Console.WriteLine($"Hello {user.Name}!"); + } + } + + And with this, code analogous to this will be generated: + + partial class MyViewModel + { + private RelayCommand? greetUserCommand; + + public IRelayCommand GreetUserCommand => greetUserCommand ??= new RelayCommand(GreetUser); + } + + + + The following signatures are supported for annotated methods: + + void Method(); + + Will generate an property (using a instance). + + void Method(T?); + + Will generate an property (using a instance). + + Task Method(); + Task Method(CancellationToken); + Task<T> Method(); + Task<T> Method(CancellationToken); + + Will both generate an property (using an instance). + + Task Method(T?); + Task Method(T?, CancellationToken); + Task<T> Method(T?); + Task<T> Method(T?, CancellationToken); + + Will both generate an property (using an instance). + + + + + + Gets or sets the name of the property or method that will be invoked to check whether the + generated command can be executed at any given time. The referenced member needs to return + a value, and has to have a signature compatible with the target command. + + + + + Gets or sets a value indicating whether or not to allow concurrent executions for an asynchronous command. + + When set for an attribute used on a method that would result in an or an + property to be generated, this will modify the behavior of these commands + when an execution is invoked while a previous one is still running. It is the same as creating an instance of + these command types with a constructor such as + and using the value. + + + Using this property is not valid if the target command doesn't map to an asynchronous command. + + + + Gets or sets a value indicating whether or not to exceptions should be propagated to . + + When set for an attribute used on a method that would result in an or an + property to be generated, this will modify the behavior of these commands + in case an exception is thrown by the underlying operation. It is the same as creating an instance of + these command types with a constructor such as + and using the value. + + + Using this property is not valid if the target command doesn't map to an asynchronous command. + + + + Gets or sets a value indicating whether a cancel command should also be generated for an asynchronous command. + + When set to , this additional code will be generated: + + partial class MyViewModel + { + private ICommand? loginUserCancelCommand; + + public ICommand LoginUserCancelCommand => loginUserCancelCommand ??= LoginUserCommand.CreateCancelCommand(); + } + + Where LoginUserCommand is an defined in the class (or generated by this attribute as well). + + + Using this property is not valid if the target command doesn't map to a cancellable asynchronous command. + + + + Extensions for the type. + + + + + Creates an instance that can be used to cancel execution on the input command. + The returned command will also notify when it can be executed based on the state of the wrapped command. + + The input instance to create a cancellation command for. + An instance that can be used to monitor and signal cancellation for . + The returned instance is not guaranteed to be unique across multiple invocations with the same arguments. + Thrown if is . + + + + An interface expanding to support asynchronous operations. + + + + + Gets the last scheduled , if available. + This property notifies a change when the completes. + + + + + Gets a value indicating whether a running operation for this command can currently be canceled. + + + The exact sequence of events that types implementing this interface should raise is as follows: + + + The command is initially not running: , + and are . + + + The command starts running: and switch to + . is set to . + + + If the operation is canceled: switches to + and switches to . + + + The operation completes: and switch + to . The state of is undefined. + + + This only applies if the underlying logic for the command actually supports cancelation. If that is + not the case, then and will always remain + regardless of the current state of the command. + + + + + Gets a value indicating whether a cancelation request has been issued for the current operation. + + + + + Gets a value indicating whether the command currently has a pending operation being executed. + + + + + Provides a more specific version of , + also returning the representing the async operation being executed. + + The input parameter. + The representing the async operation being executed. + Thrown if is incompatible with the underlying command implementation. + + + + Communicates a request for cancelation. + + + If the underlying command is not running, or if it does not support cancelation, this method will perform no action. + Note that even with a successful cancelation, the completion of the current operation might not be immediate. + + + + + A generic interface representing a more specific version of . + + The type used as argument for the interface methods. + This interface is needed to solve the diamond problem with base classes. + + + + Provides a strongly-typed variant of . + + The input parameter. + The representing the async operation being executed. + + + + An interface expanding with the ability to raise + the event externally. + + + + + Notifies that the property has changed. + + + + + A generic interface representing a more specific version of . + + The type used as argument for the interface methods. + + + + Provides a strongly-typed variant of . + + The input parameter. + Whether or not the current command can be executed. + Use this overload to avoid boxing, if is a value type. + + + + Provides a strongly-typed variant of . + + The input parameter. + Use this overload to avoid boxing, if is a value type. + + + + A implementation wrapping to support cancellation. + + + + + The wrapped instance. + + + + + Creates a new instance. + + The instance to wrap. + + + + + + + + + + + + + + + + A reusable instance that is always disabled. + + + + + + + + Gets a shared, reusable instance. + + + This instance can safely be used across multiple objects without having + to worry about this static keeping others alive, as the event uses a + custom accessor that just discards items (as the event is known to never + be raised). As such, this instance will never act as root for other objects. + + + + + + + + + + + An interface for commands that know whether they support cancellation or not. + + + + + Gets whether or not the current command supports cancellation. + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the + method is . This type does not allow you to accept command parameters + in the and callback methods. + + + + + The to invoke when is used. + + + + + The optional action to invoke when is used. + + + + + + + + Initializes a new instance of the class that can always execute. + + The execution logic. + Thrown if is . + + + + Initializes a new instance of the class. + + The execution logic. + The execution status logic. + Thrown if or are . + + + + + + + + + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is . This class allows you to accept command parameters + in the and callback methods. + + The type of parameter being passed as input to the callbacks. + + + + The to invoke when is used. + + + + + The optional action to invoke when is used. + + + + + + + + Initializes a new instance of the class that can always execute. + + The execution logic. + + Due to the fact that the interface exposes methods that accept a + nullable parameter, it is recommended that if is a reference type, + you should always declare it as nullable, and to always perform checks within . + + Thrown if is . + + + + Initializes a new instance of the class. + + The execution logic. + The execution status logic. + See notes in . + Thrown if or are . + + + + + + + + + + + + + + + + + + + Tries to get a command argument of compatible type from an input . + + The input parameter. + The resulting value, if any. + Whether or not a compatible command argument could be retrieved. + + + + Throws an if an invalid command argument is used. + + The input parameter. + Thrown with an error message to give info on the invalid parameter. + + + + An interface for a type providing the ability to exchange messages between different objects. + This can be useful to decouple different modules of an application without having to keep strong + references to types being referenced. It is also possible to send messages to specific channels, uniquely + identified by a token, and to have different messengers in different sections of an applications. + In order to use the functionalities, first define a message type, like so: + + public sealed class LoginCompletedMessage { } + + Then, register your a recipient for this message: + + Messenger.Default.Register<MyRecipientType, LoginCompletedMessage>(this, (r, m) => + { + // Handle the message here... + }); + + The message handler here is a lambda expression taking two parameters: the recipient and the message. + This is done to avoid the allocations for the closures that would've been generated if the expression + had captured the current instance. The recipient type parameter is used so that the recipient can be + directly accessed within the handler without the need to manually perform type casts. This allows the + code to be less verbose and more reliable, as all the checks are done just at build time. If the handler + is defined within the same type as the recipient, it is also possible to directly access private members. + This allows the message handler to be a static method, which enables the C# compiler to perform a number + of additional memory optimizations (such as caching the delegate, avoiding unnecessary memory allocations). + Finally, send a message when needed, like so: + + Messenger.Default.Send<LoginCompletedMessage>(); + + Additionally, the method group syntax can also be used to specify the message handler + to invoke when receiving a message, if a method with the right signature is available + in the current scope. This is helpful to keep the registration and handling logic separate. + Following up from the previous example, consider a class having this method: + + private static void Receive(MyRecipientType recipient, LoginCompletedMessage message) + { + // Handle the message there + } + + The registration can then be performed in a single line like so: + + Messenger.Default.Register(this, Receive); + + The C# compiler will automatically convert that expression to a instance + compatible with . + This will also work if multiple overloads of that method are available, each handling a different + message type: the C# compiler will automatically pick the right one for the current message type. + It is also possible to register message handlers explicitly using the interface. + To do so, the recipient just needs to implement the interface and then call the + extension, which will automatically register + all the handlers that are declared by the recipient type. Registration for individual handlers is supported as well. + + + + + Checks whether or not a given recipient has already been registered for a message. + + The type of message to check for the given recipient. + The type of token to check the channel for. + The target recipient to check the registration for. + The token used to identify the target channel to check. + Whether or not has already been registered for the specified message. + Thrown if or are . + + + + Registers a recipient for a given type of message. + + The type of recipient for the message. + The type of message to receive. + The type of token to use to pick the messages to receive. + The recipient that will receive the messages. + A token used to determine the receiving channel to use. + The to invoke when a message is received. + Thrown if , or are . + Thrown when trying to register the same message twice. + + + + Unregisters a recipient from all registered messages. + + The recipient to unregister. + + This method will unregister the target recipient across all channels. + Use this method as an easy way to lose all references to a target recipient. + If the recipient has no registered handler, this method does nothing. + + Thrown if is . + + + + Unregisters a recipient from all messages on a specific channel. + + The type of token to identify what channel to unregister from. + The recipient to unregister. + The token to use to identify which handlers to unregister. + If the recipient has no registered handler, this method does nothing. + Thrown if or are . + + + + Unregisters a recipient from messages of a given type. + + The type of message to stop receiving. + The type of token to identify what channel to unregister from. + The recipient to unregister. + The token to use to identify which handlers to unregister. + If the recipient has no registered handler, this method does nothing. + Thrown if or are . + + + + Sends a message of the specified type to all registered recipients. + + The type of message to send. + The type of token to identify what channel to use to send the message. + The message to send. + The token indicating what channel to use. + The message that was sent (ie. ). + Thrown if or are . + + + + Performs a cleanup on the current messenger. + Invoking this method does not unregister any of the currently registered + recipient, and it can be used to perform cleanup operations such as + trimming the internal data structures of a messenger implementation. + + + + + Resets the instance and unregisters all the existing recipients. + + + + + Extensions for the type. + + + + + + A class that acts as a container to load the instance linked to + the method. + This class is needed to avoid forcing the initialization code in the static constructor to run as soon as + the type is referenced, even if that is done just to use methods + that do not actually require this instance to be available. + We're effectively using this type to leverage the lazy loading of static constructors done by the runtime. + + + + + The instance associated with . + + + + + A non-generic version of . + + + + + The instance used to track the preloaded registration action for each recipient. + + + + + A class that acts as a static container to associate a instance to each + type in use. This is done because we can only use a single type as key, but we need to track + associations of each recipient type also across different communication channels, each identified by a token. + Since the token is actually a compile-time parameter, we can use a wrapping class to let the runtime handle a different + instance for each generic type instantiation. This lets us only worry about the recipient type being inspected. + + The token indicating what channel to use. + + + + The instance used to track the preloaded registration action for each recipient. + + + + + Checks whether or not a given recipient has already been registered for a message. + + The type of message to check for the given recipient. + The instance to use to check the registration. + The target recipient to check the registration for. + Whether or not has already been registered for the specified message. + This method will use the default channel to check for the requested registration. + Thrown if or are . + + + + Registers all declared message handlers for a given recipient, using the default channel. + + The instance to use to register the recipient. + The recipient that will receive the messages. + See notes for for more info. + Thrown if or are . + + + + Registers all declared message handlers for a given recipient. + + The type of token to identify what channel to use to receive messages. + The instance to use to register the recipient. + The recipient that will receive the messages. + The token indicating what channel to use. + + This method will register all messages corresponding to the interfaces + being implemented by . If none are present, this method will do nothing. + Note that unlike all other extensions, this method will use reflection to find the handlers to register. + Once the registration is complete though, the performance will be exactly the same as with handlers + registered directly through any of the other generic extensions for the interface. + + Thrown if , or are . + + + + Registers a recipient for a given type of message. + + The type of message to receive. + The instance to use to register the recipient. + The recipient that will receive the messages. + Thrown when trying to register the same message twice. + This method will use the default channel to perform the requested registration. + Thrown if or are . + + + + Registers a recipient for a given type of message. + + The type of message to receive. + The type of token to identify what channel to use to receive messages. + The instance to use to register the recipient. + The recipient that will receive the messages. + The token indicating what channel to use. + Thrown when trying to register the same message twice. + This method will use the default channel to perform the requested registration. + Thrown if , or are . + + + + Registers a recipient for a given type of message. + + The type of message to receive. + The instance to use to register the recipient. + The recipient that will receive the messages. + The to invoke when a message is received. + Thrown when trying to register the same message twice. + This method will use the default channel to perform the requested registration. + Thrown if , or are . + + + + Registers a recipient for a given type of message. + + The type of recipient for the message. + The type of message to receive. + The instance to use to register the recipient. + The recipient that will receive the messages. + The to invoke when a message is received. + Thrown when trying to register the same message twice. + This method will use the default channel to perform the requested registration. + Thrown if , or are . + + + + Registers a recipient for a given type of message. + + The type of message to receive. + The type of token to use to pick the messages to receive. + The instance to use to register the recipient. + The recipient that will receive the messages. + A token used to determine the receiving channel to use. + The to invoke when a message is received. + Thrown when trying to register the same message twice. + Thrown if , or are . + + + + Unregisters a recipient from messages of a given type. + + The type of message to stop receiving. + The instance to use to unregister the recipient. + The recipient to unregister. + + This method will unregister the target recipient only from the default channel. + If the recipient has no registered handler, this method does nothing. + + Thrown if or are . + + + + Sends a message of the specified type to all registered recipients. + + The type of message to send. + The instance to use to send the message. + The message that has been sent. + + This method is a shorthand for when the + message type exposes a parameterless constructor: it will automatically create + a new instance and send that to its recipients. + + Thrown if is . + + + + Sends a message of the specified type to all registered recipients. + + The type of message to send. + The instance to use to send the message. + The message to send. + The message that was sent (ie. ). + Thrown if or are . + + + + Sends a message of the specified type to all registered recipients. + + The type of message to send. + The type of token to identify what channel to use to send the message. + The instance to use to send the message. + The token indicating what channel to use. + The message that has been sen. + + This method will automatically create a new instance + just like , and then send it to the right recipients. + + Thrown if or are . + + + + Creates an instance that can be used to be notified whenever a message of a given type is broadcast by a messenger. + + The type of message to use to receive notification for through the resulting instance. + The instance to use to register the recipient. + An instance to receive notifications for messages being broadcast. + Thrown if is . + + + + Creates an instance that can be used to be notified whenever a message of a given type is broadcast by a messenger. + + The type of message to use to receive notification for through the resulting instance. + The type of token to identify what channel to use to receive messages. + The instance to use to register the recipient. + A token used to determine the receiving channel to use. + An instance to receive notifications for messages being broadcast. + Thrown if or are . + + + + An implementations for a given message type. + + The type of messages to listen to. + + + + The instance to use to register the recipient. + + + + + Creates a new instance with the given parameters. + + The instance to use to register the recipient. + + + + + + + An implementation for . + + + + + The instance to use to register the recipient. + + + + + The target instance currently in use. + + + + + Creates a new instance with the specified parameters. + + The instance to use to register the recipient. + The instance to use to create the recipient for. + + + + + + + + + + An implementations for a given pair of message and token types. + + The type of messages to listen to. + The type of token to identify what channel to use to receive messages. + + + + The instance to use to register the recipient. + + + + + The token used to determine the receiving channel to use. + + + + + Creates a new instance with the given parameters. + + The instance to use to register the recipient. + A token used to determine the receiving channel to use. + + + + + + + An implementation for . + + + + + The instance to use to register the recipient. + + + + + The target instance currently in use. + + + + + The token used to determine the receiving channel to use. + + + + + Creates a new instance with the specified parameters. + + The instance to use to register the recipient. + The instance to use to create the recipient for. + A token used to determine the receiving channel to use. + + + + + + + + + + A simple buffer writer implementation using pooled arrays. + + The type of items to store in the list. + + This type is a to avoid the object allocation and to + enable the pattern-based support. We aren't worried with consumers not + using this type correctly since it's private and only accessible within the parent type. + + + + + The default buffer size to use to expand empty arrays. + + + + + The underlying array. + + + + + The span mapping to . + + All writes are done through this to avoid covariance checks. + + + + The starting offset within . + + + + + Creates a new instance of the struct. + + A new instance. + + + + Gets a with the current items. + + + + + Adds a new item to the current collection. + + The item to add. + + + + Resets the underlying array and the stored items. + + + + + Resizes when there is no space left for new items, then adds one + + The item to add. + + + + + + + A dispatcher type that invokes a given callback. + + + This type is used to avoid type aliasing with when the generic + arguments are not known. Additionally, this is an abstract class and not an interface so that when + is called, virtual dispatch will be used instead of interface + stub dispatch, which is much slower and with more indirections. + + + + + Invokes the current callback on a target recipient, with a specified message. + + The target recipient for the message. + The message being broadcast. + + + + A generic version of . + + The type of recipient for the message. + The type of message to receive. + + + + The underlying callback to invoke. + + + + + Initializes a new instance of the class. + + The input instance. + + + + + + + A simple type representing an immutable pair of types. + + + This type replaces a simple as it's faster in its + and methods, and because + unlike a value tuple it exposes its fields as immutable. Additionally, the + and fields provide additional clarity reading + the code compared to and . + + + + + The type of registered message. + + + + + The type of registration token. + + + + + Initializes a new instance of the struct. + + The type of registered message. + The type of registration token. + + + + + + + + + + + + + An empty type representing a generic token with no specific value. + + + + + + + + + + + + + + An interface for a recipient that declares a registration for a specific message type. + + The type of message to receive. + + + + Receives a given message instance. + + The message being received. + + + + A used to represent actions to invoke when a message is received. + The recipient is given as an input argument to allow message registrations to avoid creating + closures: if an instance method on a recipient needs to be invoked it is possible to just + cast the recipient to the right type and then access the local method from that instance. + + The type of recipient for the message. + The type of message to receive. + The recipient that is receiving the message. + The message being received. + + + + A for request messages that can receive multiple replies, which can either be used directly or through derived classes. + + The type of request to make. + + + + The collection of received replies. We accept both instance, representing already running + operations that can be executed in parallel, or instances, which can be used so that multiple + asynchronous operations are only started sequentially from and do not overlap in time. + + + + + The instance used to link the token passed to + and the one passed to all subscribers to the message. + + + + + Gets the instance that will be linked to the + one used to asynchronously enumerate the received responses. This can be used to cancel asynchronous + replies that are still being processed, if no new items are needed from this request message. + Consider the following example, where we define a message to retrieve the currently opened documents: + + public class OpenDocumentsRequestMessage : AsyncCollectionRequestMessage<XmlDocument> { } + + We can then request and enumerate the results like so: + + await foreach (var document in Messenger.Default.Send<OpenDocumentsRequestMessage>()) + { + // Process each document here... + } + + If we also want to control the cancellation of the token passed to each subscriber to the message, + we can do so by passing a token we control to the returned message before starting the enumeration + (). + The previous snippet with this additional change looks as follows: + + await foreach (var document in Messenger.Default.Send<OpenDocumentsRequestMessage>().WithCancellation(cts.Token)) + { + // Process each document here... + } + + When no more new items are needed (or for any other reason depending on the situation), the token + passed to the enumerator can be canceled (by calling ), + and that will also notify the remaining tasks in the request message. The token exposed by the message + itself will automatically be linked and canceled with the one passed to the enumerator. + + + + + Replies to the current request message. + + The response to use to reply to the request message. + + + + Replies to the current request message. + + The response to use to reply to the request message. + Thrown if is . + + + + Replies to the current request message. + + The response to use to reply to the request message. + Thrown if is . + + + + Gets the collection of received response items. + + A value to stop the operation. + The collection of received response items. + + + + + + + A for async request messages, which can either be used directly or through derived classes. + + The type of request to make. + + + + Gets the message response. + + Thrown when is . + + + + Gets a value indicating whether a response has already been assigned to this instance. + + + + + Replies to the current request message. + + The response to use to reply to the request message. + Thrown if has already been set. + + + + Replies to the current request message. + + The response to use to reply to the request message. + Thrown if is . + Thrown if has already been set. + + + + + + + Throws an when a response is not available. + + + + + Throws an when or are called twice. + + + + + A for request messages that can receive multiple replies, which can either be used directly or through derived classes. + + The type of request to make. + + + + Gets the message responses. + + + + + Replies to the current request message. + + The response to use to reply to the request message. + + + + + + + + + + A message used to broadcast property changes in observable objects. + + The type of the property to broadcast the change for. + + + + Initializes a new instance of the class. + + The original sender of the broadcast message. + The name of the property that changed. + The value that the property had before the change. + The value that the property has after the change. + Thrown if is . + + + + Gets the original sender of the broadcast message. + + + + + Gets the name of the property that changed. + + + + + Gets the value that the property had before the change. + + + + + Gets the value that the property has after the change. + + + + + A for request messages, which can either be used directly or through derived classes. + + The type of request to make. + + + + Gets the message response. + + Thrown when is . + + + + Gets a value indicating whether a response has already been assigned to this instance. + + + + + Replies to the current request message. + + The response to use to reply to the request message. + Thrown if has already been set. + + + + Implicitly gets the response from a given instance. + + The input instance. + Thrown if is . + Thrown when is . + + + + Throws an when a response is not available. + + + + + Throws an when is called twice. + + + + + A base message that signals whenever a specific value has changed. + + The type of value that has changed. + + + + Initializes a new instance of the class. + + The value that has changed. + + + + Gets the value that has changed. + + + + + A class providing a reference implementation for the interface. + + + This implementation uses strong references to track the registered + recipients, so it is necessary to manually unregister them when they're no longer needed. + + + + + The collection of currently registered recipients, with a link to their linked message receivers. + + + This collection is used to allow reflection-free access to all the existing + registered recipients from and other methods in this type, + so that all the existing handlers can be removed without having to dynamically create + the generic types for the containers of the various dictionaries mapping the handlers. + + + + + The and instance for types combination. + + + The values are just of type as we don't know the type parameters in advance. + Each method relies on to get the type-safe instance of the + or class for each pair of generic arguments in use. + + + + + Gets the default instance. + + + + + + + + + + + + + + Registers a recipient for a given type of message. + + The type of message to receive. + The type of token to use to pick the messages to receive. + The recipient that will receive the messages. + A token used to determine the receiving channel to use. + The input instance to register, or null. + Thrown when trying to register the same message twice. + + + + + + + + + + + + + + + + + + + + + + Tries to get the instance of currently + registered recipients for the input type. + + The type of message to send. + The resulting instance, if found. + Whether or not the required instance was found. + + + + Tries to get the instance of currently registered recipients + for the combination of types and . + + The type of message to send. + The type of token to identify what channel to use to send the message. + The resulting instance, if found. + Whether or not the required instance was found. + + + + Gets the instance of currently + registered recipients for the input type. + + The type of message to send. + A instance with the requested type arguments. + + + + Gets the instance of currently registered recipients + for the combination of types and . + + The type of message to send. + The type of token to identify what channel to use to send the message. + A instance with the requested type arguments. + + + + A mapping type representing a link to recipients and their view of handlers per communication channel. + + + This type is a specialization of for tokens. + + + + + Initializes a new instance of the class. + + The message type being used. + + + + Creates a new instance of the class. + + The type of message to receive. + A new instance. + + + + + + + A mapping type representing a link to recipients and their view of handlers per communication channel. + + The type of token to use to pick the messages to receive. + + This type is defined for simplicity and as a workaround for the lack of support for using type aliases + over open generic types in C# (using type aliases can only be used for concrete, closed types). + + + + + Initializes a new instance of the class. + + The message type being used. + + + + Creates a new instance of the class. + + The type of message to receive. + A new instance. + + + + + + + An interface for the and types which allows to retrieve + the type arguments from a given generic instance without having any prior knowledge about those arguments. + + + + + Gets the instance representing the current type arguments. + + + + + A simple type representing a recipient. + + + This type is used to enable fast indexing in each mapping dictionary, + since it acts as an external override for the and + methods for arbitrary objects, removing both + the virtual call and preventing instances overriding those methods in this context. + Using this type guarantees that all the equality operations are always only done + based on reference equality for each registered recipient, regardless of its type. + + + + + The registered recipient. + + + + + Initializes a new instance of the struct. + + The target recipient instance. + + + + + + + + + + + + + Throws an when trying to add a duplicate handler. + + + + + A class providing a reference implementation for the interface. + + + + This implementation uses weak references to track the registered + recipients, so it is not necessary to manually unregister them when they're no longer needed. + + + The type will automatically perform internal trimming when + full GC collections are invoked, so calling manually is not necessary to + ensure that on average the internal data structures are as trimmed and compact as possible. + + + + + + The map of currently registered recipients for all message types. + + + + + Initializes a new instance of the class. + + + + + Gets the default instance. + + + + + + + + + + + Registers a recipient for a given type of message. + + The type of message to receive. + The type of token to use to pick the messages to receive. + The recipient that will receive the messages. + A token used to determine the receiving channel to use. + Thrown when trying to register the same message twice. + + This method is a variation of + that is specialized for recipients implementing . See more comments at the top of this type, as well as + within and in the types. + + + + + Registers a recipient for a given type of message. + + The type of message to receive. + The type of token to use to pick the messages to receive. + The recipient that will receive the messages. + A token used to determine the receiving channel to use. + The input instance to register, or null. + Thrown when trying to register the same message twice. + + + + + + + + + + + + + + + + Implements the broadcasting logic for . + + + + + + + This method is not a local function to avoid triggering multiple compilations due to TToken + potentially being a value type, which results in specialized code due to reified generics. This is + necessary to work around a Roslyn limitation that causes unnecessary type parameters in local + functions not to be discarded in the synthesized methods. Additionally, keeping this loop outside + of the EH block (the block) can help result in slightly better codegen. + + + + + + + + + + + Executes a cleanup without locking the current instance. This method has to be + invoked when a lock on has already been acquired. + + + + + Executes a cleanup without locking the current instance. This method has to be + invoked when a lock on has already been acquired. + + + + + Throws an when trying to add a duplicate handler. + + + + + A container for all shared configuration switches for the MVVM Toolkit. + + + + This type uses a very specific setup for configuration switches to ensure ILLink can work the best. + This mirrors the architecture of feature switches in the runtime as well, and it's needed so that + no static constructor is generated for the type. + + + For more info, see . + + + + + + The configuration property name for . + + + + + The backing field for . + + + + + Gets a value indicating whether or not support for should be enabled (defaults to ). + + + + + Gets a configuration value for a specified property. + + The property name to retrieve the value for. + The cached result for the target configuration value. + The default value for the feature switch, if not set. + The value of the specified configuration setting. + + + + Internal polyfill for . + + + + + Throws an if is . + + The reference type argument to validate as non-. + The name of the parameter with which corresponds. + + + + A specialized version for generic values. + + The type of values to check. + + This type is needed because if there had been a generic overload with a generic parameter, all calls + would have just been bound by that by the compiler instead of the overload. + + + + + Throws an if is . + + The reference type argument to validate as non-. + The name of the parameter with which corresponds. + + + + Throws an . + + The name of the parameter that failed validation. + + + + A specialized implementation to be used with messenger types. + + The type of keys in the dictionary. + The type of values in the dictionary. + + + + The index indicating the start of a free linked list. + + + + + The array of 1-based indices for the items stored in . + + + + + The array of currently stored key-value pairs (ie. the lists for each hash group). + + + + + A coefficient used to speed up retrieving the target bucket when doing lookups. + + + + + The current number of items stored in the map. + + + + + The 1-based index for the start of the free list within . + + + + + The total number of empty items. + + + + + Initializes a new instance of the class. + + + + + + + + + + + + + + Checks whether or not the dictionary contains a pair with a specified key. + + The key to look for. + Whether or not the key was present in the dictionary. + + + + Gets the value if present for the specified key. + + The key to look for. + The value found, otherwise . + Whether or not the key was present. + + + + + + + Gets the value for the specified key, or, if the key is not present, + adds an entry and returns the value by ref. This makes it possible to + add or update a value in a single look up operation. + + Key to look for. + Reference to the new or existing value. + + + + + + + Enumerator for . + + + + + The entries being enumerated. + + + + + The current enumeration index. + + + + + The current dictionary count. + + + + + Creates a new instance. + + The input dictionary to enumerate. + + + + + + + Gets the current key. + + + + + Gets the current value. + + + + + Gets the value for the specified key, or. + + Key to look for. + Reference to the existing value. + + + + Initializes the current instance. + + The target capacity. + + + + + Resizes the current dictionary to reduce the number of collisions + + + + + Gets a reference to a target bucket from an input hashcode. + + The input hashcode. + A reference to the target bucket. + + + + A type representing a map entry, ie. a node in a given list. + + + + + The cached hashcode for ; + + + + + 0-based index of next entry in chain: -1 means end of chain + also encodes whether this entry this.itself_ is part of the free list by changing sign and subtracting 3, + so -2 means end of free list, -3 means index 0 but on free list, -4 means index 1 but on free list, etc. + + + + + The key for the value in the current node. + + + + + The value in the current node, if present. + + + + + Throws an when trying to load an element with a missing key. + + + + + A helper class for . + + + + + Maximum prime smaller than the maximum array length. + + + + + An arbitrary prime factor used in . + + + + + Table of prime numbers to use as hash table sizes. + + + + + Checks whether a value is a prime. + + The value to check. + Whether or not is a prime. + + + + Gets the smallest prime bigger than a specified value. + + The target minimum value. + The new prime that was found. + + + + Returns size of hashtable to grow to. + + The previous table size. + The expanded table size. + + + + Returns approximate reciprocal of the divisor: ceil(2**64 / divisor). + + This should only be used on 64-bit. + + + + Performs a mod operation using the multiplier pre-computed with . + + This should only be used on 64-bit. + + + + A base interface masking instances and exposing non-generic functionalities. + + + + + Gets the count of entries in the dictionary. + + + + + Clears the current dictionary. + + + + + An interface providing key type contravariant and value type covariant access + to a instance. + + The contravariant type of keys in the dictionary. + The covariant type of values in the dictionary. + + + + Gets the value with the specified key. + + The key to look for. + The returned value. + Thrown if the key wasn't present. + + + + An interface providing key type contravariant access to a instance. + + The contravariant type of keys in the dictionary. + + + + Tries to remove a value with a specified key, if present. + + The key of the value to remove. + Whether or not the key was present. + + + + Schedules a callback roughly every gen 2 GC (you may see a Gen 0 an Gen 1 but only once). + Ported from https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Gen2GcCallback.cs. + + + + + The callback to invoke at each GC. + + + + + A weak to the target object to pass to . + + + + + Initializes a new instance of the class. + + The callback to invoke at each GC. + The target object to pass as argument to . + + + + Schedules a callback to be called on each GC until the target is collected. + + The callback to invoke at each GC. + The target object to pass as argument to . + + + + Finalizes an instance of the class. + This finalizer is re-registered with as long as + the target object is alive, which means it will be executed again every time a generation 2 + collection is triggered (as the instance itself would be moved to + that generation after surviving the generation 0 and 1 collections the first time). + + + + + A custom instance that is specifically optimized to be used + by . In particular, it offers zero-allocation enumeration of stored items. + + Tke key of items to store in the table. + The values to store in the table. + + + + Initial length of the table. Must be a power of two. + + + + + This lock protects all mutation of data in the table. Readers do not take this lock. + + + + + The actual storage for the table; swapped out as the table grows. + + + + + Initializes a new instance of the class. + + + + + + + + Tries to add a new pair to the table. + + The key to add. + The value to associate with key. + + + + + + + + + + Implements the functionality for under a lock. + + The input key. + The callback to use to create a new item. + The new item to store. + + + + + + + Provides an enumerator for the current instance. + + + + + Parent table, set to null when disposed. + + + + + Last index in the container that should be enumerated. + + + + + The current index into the container. + + + + + The current key, if available. + + + + + The current value, if available. + + + + + Initializes a new instance of the class. + + The input instance being enumerated. + + + + + + + + + + Gets the current key. + + + + + Gets the current value. + + + + + Worker for adding a new key/value pair. Will resize the container if it is full. + + The key for the new entry. + The value for the new entry. + + + + A single entry within a instance. + + + + + Holds key and value using a weak reference for the key and a strong reference for the + value that is traversed only if the key is reachable without going through the value. + + + + + Cached copy of key's hashcode. + + + + + Index of next entry, -1 if last. + + + + + Container holds the actual data for the table. A given instance of Container always has the same capacity. When we need + more capacity, we create a new Container, copy the old one into the new one, and discard the old one. This helps enable + lock-free reads from the table, as readers never need to deal with motion of entries due to rehashing. + + + + + The with which this container is associated. + + + + + buckets[hashcode & (buckets.Length - 1)] contains index of the first entry in bucket (-1 if empty). + + + + + The table entries containing the stored dependency handles + + + + + firstFreeEntry < entries.Length => table has capacity, entries grow from the bottom of the table. + + + + + Flag detects if OOM or other background exception threw us out of the lock. + + + + + Set to true when initially finalized + + + + + Used to ensure the next allocated container isn't finalized until this one is GC'd. + + + + + Initializes a new instance of the class. + + The input object associated with the current instance. + + + + Initializes a new instance of the class. + + The input object associated with the current instance. + The array of buckets. + The array of entries. + The index of the first free entry. + + + + Gets the capacity of the current container. + + + + + Gets the index of the first free entry. + + + + + Worker for adding a new key/value pair. Container must NOT be full. + + + + + Worker for finding a key/value pair. Must hold lock. + + + + + Returns -1 if not found (if key expires during FindEntry, this can be treated as "not found."). + Must hold lock, or be prepared to retry the search while holding lock. + + This method requires to be on the stack to be properly tracked. + + + + Gets the entry at the specified entry index. + + + + + Removes the specified key from the table, if it exists. + + + + + Removes a given entry at a specified index. + + The index of the entry to remove. + + + + Resize, and scrub expired keys off bucket lists. Must hold . + + + is less than entries.Length on exit, that is, the table has at least one free entry. + + + + + Creates a new of a specified size with the current items. + + The new requested size. + The new instance with the requested size. + + + + Verifies that the current instance is valid. + + Thrown if the current instance is invalid. + + + + Finalizes the current instance. + + + + diff --git a/_dist/nextcloud/DynamicData.dll b/_dist/nextcloud/DynamicData.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/ExCSS.dll b/_dist/nextcloud/ExCSS.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Fizzler.dll b/_dist/nextcloud/Fizzler.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/HtmlAgilityPack.dll b/_dist/nextcloud/HtmlAgilityPack.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Markdown.Avalonia.Full.dll b/_dist/nextcloud/Markdown.Avalonia.Full.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Markdown.Avalonia.Html.dll b/_dist/nextcloud/Markdown.Avalonia.Html.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Markdown.Avalonia.Svg.dll b/_dist/nextcloud/Markdown.Avalonia.Svg.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Markdown.Avalonia.SyntaxHigh.dll b/_dist/nextcloud/Markdown.Avalonia.SyntaxHigh.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Markdown.Avalonia.dll b/_dist/nextcloud/Markdown.Avalonia.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/MicroCom.Runtime.dll b/_dist/nextcloud/MicroCom.Runtime.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Newtonsoft.Json.dll b/_dist/nextcloud/Newtonsoft.Json.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Nextcloud.dll b/_dist/nextcloud/Nextcloud.dll index f5dd0c37cd2abf0df48c937e10d8b8d349408a68..fd446d3c5c016a846b27f844b4062d25f4936cca 100644 GIT binary patch delta 10332 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 delta 9905 zcmbtadt6l2_FsFSGv~}4V3;>E!@$gd3O+(WQSc4E4MkJS2VGxaA>}AwiHO6X;ycBY zR%+$5H0_q5_ornyExcwAlhT{^P`PD>l{asB&D%|XYwtM<^!WYr8$ahe>$~>aYpuQZ zI!UPDKHN)P=U}+lkY;gZRvb{_V#^WXK4_5X%#{s^nZ>7s?|%T%LX2TxmBy=(du26BF`O7%b0<7%^~IM6ss$;2InUCL69nH)X~;K zWQn@LI!uQpRobd%Q>^;4)u2Y%Tx6M=Wb=~c7{Tt&!;NaYUf5%yaWil$l1=C*unHkU&T?WYCy>?ZVEc9ZY8=HKEX~2d z$yf{t<+bW)N1OI4jwC;hP!_;Rm1zJXt-uWt16UQQ9i=y=jwqC_tK005iSY@v3_OVt zVIj#+srzFx&5z-z2bC}&8orGfo!eo>Y^lP8xG?lKVEip~fnwOFgb_V8S; zP2nMXA_ne8=YbtK7HOf$PWxn!q$)Sc#RY0s8zTd)hQ0xzh>SU=gVrp9{69(8!^ za`I>OOza}^l6t=Yi7?AiTBn}( zv`yK^9PdZKtodjKW+hsLoAzofo*@}`tz+PSaGd3MKuwPuPF_{3;u74iq0aXdd-M(dYnAK{0ShJrvi6ysrKnmrnkwro?ArXFU+#F?uCVkZj2r_|>jM;0<+4ynX0l zBr9D2v03cgrxka22U>9i$Fh>Snu#Y_=QKAIZzM&^lF>lIhPo9WV}BFPI)F8m0MoJ$ zt*BQ!dUIUIaRfV*4N2hlvtxswmDCjjaDpYc%HI>4*sKa`gX+;CtW!ZTE zCJMaAF&m01sY7$BLI4{=;cD99B%TQ26|`0dANzeho*BPqzUFt;wBjQcsVgSnh>*kV zv0iO?iflyQ5Gm*br%(!mQ7^E3-1`)fA$G` zDT~FP=)h_oM2UaG2{zY|J4^mlb3nm%$Bv~T1U^T^&3lg-SW`vliR0L5xOr?ma1J46 zyb@+o;5@UIvaD#NsbaJ3ha1qtvsG8y{bw{Ev?h;e8PA%23 zh615v8r}_jNFe!=`j5n<)F!lOO9PkLmk{^{zi^c@Oct=0b$D6$B z>AI{oKhXQWL#0%b5sByjD!kBE-NXT`9LWa7Cy@cIEj6jICeDb83BMdFGw6bcIW{7K7{;``b$cZdp9zi z4Ab#=1P^q=d+!FQeLD9FUXNz|f+3+H&R|xci)V>hg0Caj#VBw^DwY%w&AWUGe5lD| zjqSi9{%AJBX;LRhu+3mV`@Y0rPJ!&`M`9$HrZ<=^u)}oBrNDUGSfc}i@z*U93_=?P z#@UJ`H|&pB1vlJuP73-Z2t=&IY0)-@?{WE3go1Kn#7Ub3JtE><7Pt_73^9e{O&^mt zTaLK~!BDHgJOY+PRYY6huNcw-7rD(z*D;qHUMF|CEpQa|Zn!I!g&e29=(RwqrF*O! z-Z5YF2HkLjs6smIHlKCf15Htz(CC&+#g*maI@~b8!=}ymGyIy5zCaL)ayUIIN|*guS{T3!QNs!9-pP;6o4x`J7|VN5g& zv)*=2mLQY#c1aKysl+(oC;7T19(s9VtZvBlABb|mW_PjM0eOVsz$k`~qeg-e7{Gzu za^2#9eu(if*vw|VXgd%k!FOgBeg>@*9N@xH34&3$i+!M2d^gGsSDe?dIE}o#|3*xQ zG(~n=pp)*H>t6WSt}|KSxXg;Y7fULERiEQ_LuW73q$=&ua=e?#*|;?pSZrjt5o<63 z=Pt*EeT9{_z$hEj2OP&-32-^66MgCMwbf%%;HsetTjqO22|~OBCMm2B-m)3Y-QWjZ zsn89^(NduY1EiSG+|jrnBR@+09&|zp_}RdZf2;L7)Cj4u^r%B zJ3}WQUB@lY8=5RRuvR`3mktxGpX!IfT3M~qQ(BBnH%dUF;&DlHBN=9Jyocilh^X2h!3M4<44*(p>ftUv@m=4wSoO;; zUBx3z@N{)rk48V^dXdE8)tcay<}Zw?gS#e?JT=fYDfp!_(RGdVfgXJHGv`E?4sxJB zX94FnqYehbFc63d-o=XzW4ZjY^MgChq=P*C$3CwZTC!^~Eg6Yz$rky-Y!tpr;gwLe zXT$~z9L#e*Ug_8+t+$m~OoL+1_H$p;;9;}?D8ox78w;~M&I+LfEoa!iLcHj_3~8`D z{tB3(SpFAQ((3x0O7NAj5pji*k2UXYn}ld}O%n+G1s)JcJLpOA3qFAvIMC8)m@O5j zJsH)=Ca9+~1_zr=r*#B2>KS&HPV4-j>i&iD9H%T1IHE)&)=O4wW~=LG#3t0V_8Hc& zQM80xh_O_VS#&*KJObR$9A`J#4@+%5P+x=#lVE|^7iA%6AAm+JQ(P*r6qgDy*k4u` z3w(PtQPU839xh{TdQz6+Cy=ZskfvLNc)yn|W2%nfOB|1KEax~7vDus5AYpZbmw8FM zVJ;hixl5rb1_GyP7sP8c6VW9w`~(K#g!kh*VRCD{sg%GE7O#SOj_1ZMd;->fpjpHV*HWi|^0Hg~m>AH;2HsrrNuf8)zX{ZH|1^8F4PL7-nu z-v|e+x8${wNBXdZ@M5+@-xKTcpvHC@3XxsVn9K7yvfh4XS>r5su(2U`*c3)LaT)?w zw4M-fvimZGKtU$JWX@{ft@zbM2lF|rbp{>Z5!@us%#f!X!nGQc*gRy024r^vs^yun zV_8@UW^s!~GRnu;IQE7DjU?Uh32WjzDHY;7NWM14Eag^~GSqis^KdC@Q)X0vg*_YShRISZF10+PD0u^RpRrk)T1oi+BU zsR-EsjUB;KM?$W~P6YKuNT+BtTIvZ=P^2-hRD^7S#y-Fsh!JWumg9^=_L#XvHTJU7AKBqB!~Lt0OwfUq0+9I&VxXK=5xOm@KAoQ3c$;k@K% z6~GCm?#wdm)7i?Wv)M9;;axDRg{iBRDZYAS@qqfi;u5_Z^cou^u0Uqf81eSR8$u_I zMR|*mpGxix31qoM@)V&V(5}gSRDIaV^^d035g)~W&yLwDzOj}!Ktwg9yYI&#=HrP_2X<1 zIcl7!BnDxOMjMP%(CLF3`$DSMCBo!B%qcrV6KNux;Vhe6HrBB48vC#HNo3Bx%u<4n z<7Z;{OpW~`o+VSo8S~PJmfJZSMDiTpA`8}YnoUw2*N~oRW%^&u^xJrrx2Ycskxg#J zF{f>AGrZm=!VrzQe5@8jvYDj=O2ov7L|Ax-bwIX~Gc!DI8G~$3P@{1%^N~6SvWbI8 zO3W%`12_v`pAumlXKVP?HxXuWcH7MwjfK7VhPL#Q%h_!&lR3NX1t3UZml{hevy7Ad7 z7T-?stfyW)Tu|=l3)wIxek@{*Gy&S9rVugRT7qyIZ5S6t0pH@8Krxh{~&jSxXH_mb! z1Bvp^1TzVkgI#DNSG9q8Vh&9s<&GgVi_ABVM151teKecQ6N`Y5-ss{i{LOqnJqvrH z3TP9b)dZo0B03&tvCArZ;2BRcqh`}0B1q-vr@~l(sj$=VD!0E1CEjJU6UrOt7IMJ0 zIf#xD{Huuv*b~xmQe&v2N631m5V}I7K8H4t)$|>D76ah33jHQJBoMmUwp=jN8^Ri) z7woie69#}sw@=s$I^6-3i{nqA{GjC{#5owai9d1pDf7_8pEp=V|0#r^&fP@}X45U+ zEHM{4Sqotl8WrIi0jtD#I!|0rrqE8F;bIY=90I*KS{%be=JSyGJXm{5ydiNmy(BCV z3t%#aPor+-2{DcSXnIC8K(4VT-UXTG5G@pUh|AF11{$Ilyt~EnAR6r#AHt04#iwxK zJ+VFABJUG+(Jw5YiDjryq-A_B%lKZF@m)N~6FNvIn^%*A^q|~McaW~ZQXkRuM#D^K zqEGwp(v|T|InMPBWH;@uJ5Jf&m+?($qQO4OU|j^ZllgXW+!abU4>Qt7ZBg{ zZ`Iwv2CvtR5(eUJXFRtbFT5WV&+CeiT-PnawH87-${Xlj5@Q%CtwaqLO7JPuq`krk z!7CpTcG{EWg96*{gF-RxZUc98R+#V1lN*GI(f1;f==%}(cnhHs=N8G0D0@kxkQrSj zPoaJM_v()eui!JnMPEszug*W7S-V^2G5WF1+>-h^x zJ%5!M1!G(@6%2_lGzL%&Wy&ZpnP)1e_}0|(SDbpj-wh-H@6cr;yA?N(9oE&#GLhYg zPw`$k1(n{dC?|Th!YRDoJ*Qlyd3b+4D0as!n@ucudVdLd4pYRzpg0O|ncu>G^Ar^t3V|$Ki z9J4rPa~#TX6yka^9&sz)ckZ{t$v_kj&I3TbsrCWo+S5|yG3jh!f2&6IUdnh&;<44A#r2R>L(jmS|LLP z&CqY*c-Ts zY#=@6nFx+`5yN_uU>rU>Y=L1i^*S~H!Vfc@sm(pJ;SAxnX%FoKf>iN6d(p!2}%57)QakHnt2>yc!YJIPP_NO$4U1y)E&;F4=0MNWdDa(@z#yTIFW9x2mL zMB6FkRsF+gUrNp!>i#t1X}wDC`$;9^a@G6B`Rf*r%M{e36aQ0pGQX6nV(l?%G-1{h3)T0)ghOQlXBma27;+4 z7Pdj{zj(TQT9*u#&<^$G#jarJtSFg7pGU}|9=|N9ma1P^UZJykA7Y~=G*IV5KcCAA z<>P{686rxS&_xEXGic)W7x5QgbLcxIoXB_Kv|krxV(EqFtT}X5M6bQj7djn+KTwPu z-G4~oL$lN&HS42JOET4CV3x^M^_!ZYDRhI_Ep3UVA2yBM9J-;-TQZg6*SRGQZwT!y z)g%%tQLWR=%#z()#pYD&RO`}q!8`hDgC&=u>nMD{Hd?BqEY)U9wVl=2Xs&kgEUW!a z6A`dNQG7mD%TnDQ1DLA~reJ%(lby@^Z=gpvOaNl39%!k~;Nt_;Da(AGp=^t)hcm3Ys!!G|xpJWT^fG5~ zJn?Yz`&k)~u*P8DI;?nghJpJYPptSCdVv~otyA!SjCd@SMiGd|$Tz9F2!BNlpW4xE z@@#74`B@WsYC&pxW@ct#+O+Od3ktgwrWQ<{nw8qEYqyMPsRfy--Me+qD9p-Gvsd&D;^iT} z$AB^*!$(q-OYr#Vc|4Y(pnceitaz~BA7|{uW4Sh2M53ffyO?=}ZW`Fy0j>*1Szk{CKS?iCf+q$wBsWU$IA^LgHL=6$};`fkrT=UNGNr35PokOVFOXuCvlR{#J8 zwzFMR(@cawz6lw0m7MxIQPY7-%rTfR`Bt zQq2h4fCOHfk$`+E75xzc5>_NI&x#Co5yZ4ceN#UYSp3g_5-8>03j;}8VKC2Dgpd;j zSL{Ry8BxHsM>1mIjlCEMa}Wd31SJr(mY@uR@*Kp$073T%GIkUPmIUeA6O9W&YaNlW zI4C3T4+`#&3$ER;8#D6V?K~aqC#Z^`F@nTt(}6TWN(8CXkhBEg&?G<j|BZh^$j07>k$8R3DP4- zpUQ&G2^Tt zB*Q{1&1^&1mR579bHYN+ZLCA7HkM}AHdbtFn=tkY+oq?}Y{YQRDC-nR1K@GXz4Nvq zuNhmT4mGW^Uc3rg%4y=0^*?R{3I;+p>EhU7`V_ zvV0PLZnMw@KobX-Zx2pt4;*&geiO)KWc8heA_{Hp_e~}Hk@p%iAMOpYedklt8@hZp zz3q(u8eRe?+QcO>EQ}M+6Q~QEY2J*$3neVIh6C!|8*G&|o@W0Y1LG9sppv2tu6~2t zfWnPCyzY(VibPt;&{L+zhM6h|p#C$|z!LGmK;>Bm?#CMfYRrXC1o91Z5(dh3g^Q4Z*E(fB{oHxpdo>r%yS%LjZ@ zl*QSf(uxt_q7l{epmGkg?W0XY;oVJEP!m^#_DZt2-y_#=pbLPN3Uv#F#xxj>skWyF zl=9Z_0c({M@vg~dO(@9L3M@j%rr+mixa8iW75>ZlfKDY5eDrMk4FoV~BIS%J9&xL2 zQF~L`CbE+c_&{iQeWLIO0;q0T&~w*zr~Aeivy(r2UOG(x^l^2k1uu|;?`34oyb8ZF za^(DL?@j6)v@~H=wuY3UpF)-9IJE!JtsnwK)i&&W$&rXQ= zXPDW#_PNMlb!2x`*yKXyrt&ofhir7b{wKoYMsWm#*ugP)h#c7Xbp6#_PN#d;-8s?z z(*|b>z}l|d_$g>kzkDZx`s6KoH7!5GqdK!;BV5E0g|n5F@!ii(y#^H|a3*1i`sH&a zjD{`6_Z{9P>cVBpIxdY?k=e*2=-H6;IU&QhxJUEY89lC=z=#_=fh}++Q?jTJ*|)r_a(oX<%@EHXfw^1bCV;NeJJ#qBIyK@rgssTUM(`KsUtNpECBJ~ONhxAh{JiQB@ zlajA2z*h6s=gpMBCj*Pi5kS-ak&DNjW3=qWBddc90%r38T{C6z$h)t%Arsy2o#YK~ zg|LeKGFqk`wJj3>$f*%AQ`w0A?z0a;XS=0TOT?z?0A7dkKB`|$i(RJ zU3L@cnO>d4J*(a`)+rzX=&7d3QXR>Dhye9Q6mH{%EU%pwk1G>Jzuy&TWD=zrJ1QdO z*A@2q3FiP3$%%qBR_lD}HU6I-mwDyK!)7%-+zuXsh*=vjBXoJZ1+8;ydnPko*bMGd zSA^o~lK9g?n>++iICd-PP5L_T#+%Kz>!@YU2q4%N7Z+JU6y>MHj6us+#lAJZRY|t5 z51!)dNLH7@qbJn&ARR+{RBm-7X}e~COWLK!=t!3iv~Fy^Xwzl1uf?y(o2f zm7k%AARUEB$7evg>4 ztB1e3v*X4oH;y)djD}2r`P5gr*bfhP?T7m)D)`)h1)C9b-_fEa1J$S9PMW+bKUnR}h5Zy_^}2Mu zM$E4HOq$!WnWm8`w&1upN z{w=Gt+^e)++br@DNrf}CR8tSc`sX3$^NKWsg?5q5v|Y>hR2i&~7nt?oM04ZU2wY^j zgzQH)nBG@W)bG5x!Je0;SzDYY9BW@LbpHkD zk&qBep#4yVGqHE>eRS+|?RX~UxB6(U@1OEEY_|RDzwlp*msPOjZy_010p&dgzM zJGnjb>=vI|IHskJXBF>iM$CsBdzxQ7sPrp3`MGE`=T@Ji_D!)^tghPozjQd^brbqVz$lI&DpqSm!P z$ZHe1BV;UeU&Ai}&P$945oB+6>Fuq^{lBXAbVrpeXFyedPX&YK9WYo&B{gQ#U>!QA z#Hr2SCT}x6S_i89f??JTgcH+J7MtyVcY_&inhS21qLDxwG#xV^CN^KoP+ z{z|}s{C!7h9ba3I8l0`$0*!QM;z5eiJt!uw(=Ga^QVV*!U!IIw%(pBUq^pY`mviQC zpwHW%`Oz|r-5Za!@t!o7?S#8^Rq*WPZ=NGZ;+(c^l52TS&%J#?XmX!71zy$F#$UWl z-Hw=?;dT9@GG0|{Ihsi%%BoOqCrVpAT9p>(Sqa^E~+OnclB zUk)qul<|4D@7+Omw)?K%a3x6Iul?q=DAS7v&cf?@0ZJdvck}muvdxd-&_4n_a;Ig^ z9KQ1q?$eipe)=N#pIcSFpa|Hia%+c0$LO`a&!(OFlrjpV_0{m*Nu8Z&uwzT@Dwx5& z%xz6}uH4sJ;RI6&w&}~^_m0){AnCNv+xL7?*x?Q}50_jsPaEO`zUj;2SA|zJAV6kq zgQA7nC->6Q%gnp=R$5TkKpWSnnyf+0jrmST%UuV&%H$skfgKh=Q(ForCGc0d(Jmxey}H)6#s=0yhL`Ct6&1>2lVnw zFuxZUsjD(lJvWNrtEX!o-8bcTVoX9r^i=sVu6Rp0)lb1HS)WIZB^5d_=pORJX;- zfHk*S>H1-}o^3FWhHPUsK|m5lPxv!UxZ&-J(yVo?oB-Li3ypSR2x9oNu1omeqvTTZ z_f{04kt0VMQ3!FbR0xJ#0N^ zN4L)wX6+##mkc!ofySm%c!iAkX`~}vTD{w~{cqZyPFo7YAJ(DRGs#Q5`~1m@`H z_4rVa9Z)ms{Tuf^W;3t1w`^X^*Y&5V44&}Boxfdil8$GXhKTw!!TjU9sBgOXfN@hL z#xe0dRmd3QQ1QOXs(Ws=E0546Za&o$OrigrO%#XN0fcrR*O|94=z>>8{X3<#y_R_} z-%Ldio{8sf{*m1HRqC@9 zCI|b>wDDds8U8ch_;^9XO7R{>@kvL#2*iZIY3Ay<8+5sdEbkTWiA#&?^U3jTp9@|L z2SS>;DxQ4O=qqAA>|Y7nt}|WRRmoJ(76%4wG*^Im=F)ibkbWxy>=A7_mBtnJ%1Tc$ z9C=cDg8Kb@wkVtN@{p>@ENvYapd)m#R5{q}`lh;A+Dt=wsr#VpIE zDW5%QF+l+2{dp#VoPS>ZJee#+;q|6ZM9SrE@U5lF#JXov9|@8fz)Aks8y)p$jE^9V zcvHkRZlY7QnFTuQpYnF8Ux0a3UHp!=NgtZDs`^HUFaB-jQ>;w)x8k%LJR*~ z>U;@hB5CSd|*TMjwIeS(gVtUOrQSTfG zWI?GJvG2ci{RLGl_3(KymHg+1{pYX#5Fab>%Lp${2#De>f!i#VAlFh9Pg&a7jq<5y zu=KRoqY?V%LQ$8-5F>j6poPDVJ@^2rzRwEE`nsW?*4bZHaqy1m4A^6-hR@G;&Oyw~ zZ$^w=CGxHfWe1rl4YX5m!cqnQz*skim@SJ!h5NrOV{DV*DURCor$AFHN~#~IeuZov z3CiQ>{Tbj{FVPV9xT|WaxLwGOO5_A2#{TmP=8QJn|Y-Rfn|c;S%xyUyOq%;yl))6lqvu(ik{jm97QJi4?dHg zo|7TM`QAlq4*JT`Tbh3X{(Qbs<8NgLWLNPQ)yv7k`S&v|7<=w)I6i%H-w<45t&X$Q zQ?H|s4q?l-^zCmcV${tFF{akMD}wdb8mzC$Plk|32OG-A?>~9sR+OwxlM$|Y_lu!L zZrl*!RQjiU{hVvbuejMMub%H!He>ub8AUfWnO_T)ZPak)aX0=;xSTXq*Pju zBc%9f61m9!yI217ZPXXyH7(?DZZttydqUs`^-XDCAMMfKHE^Npj=bNbp#n{sTq zn89hRt_Q1ojMa@|bziZ1ajaeit2f8$mtgf7Sp89~z7MN^jx}IV-Of~83R{e&YhdYd zaG{+eRr*(h4aE(6iB~0);dRWIYT@vMcLw)qvfl*T?4G2KU&+<3lpk5mT?#MQy|MY7 z#YQ=-(Fkj_#2Oh`<1(x<9{JFijWzBG@J=C%n zVA&@`MKBD@C?bgwUuMz^N!bC=)?vRg{;PY(f{%qBi#!&0Ec@8mrjHIvB>msI@zaN8 zB$BiU0DvwpJQK#bE6g@wC$poY{u6KWBKg7@zDagVcBc7RALy4n$BozK%6^5(&dt+m z)H03>V*q3{LmQelxkxMHI1HlQk%EAfF$ZX6FCb;dk+QU*J3ZmQX>94CG+4d+)~6Rp ziP(0|-dwuSSMB;kSFi6S>r?56qCLJUmB10Yf$DGlx5QetiHt!r7w7*k{?=tpc`l=v zt&}e}fx}xE!CC#==-PM6o9p&vWj<(XclHwA&H3+ zAH8NwBfco{oPdPb8d=n*3Pj@~hz~yM@ReJDn1ziF@hwb588X~G{vGOx9Vf~u+n-u| zJni_d>TXFbaEhk{Q?h*b-ruxEKQ-B5?gj7aqwuu*+}{ornjgD<&J3(Wos8ia585&u z{%fM6fRdY|XJfy_++Y3Z<=zE%W;mYC@Lyu+w77MV4scffaGeVeGt7Ux3_2e1XCW~K zmmotO>R88@LZ+vI7Dzh+(8oN?gcxI0l9(*ONNdO%7$zkuMa;ysEhI8A_CYX?xd2-Z zyP0=O3MH%5eL|vAd^x$m5B!-9~ONsc$!Etg@1QT!Q~`zE60kK@^PhWGep7qt15N z>p90#_Sf~+`9~L^=~6ta80vSp=k>pcB;BbSW;{?)d19du;F$emhb?|=T|7-5_?EJZ!(Kk+HiB_a3!;0jZwioM_N<( zh-57s^s=%3jcUP|b^*FFMl{+Im=tD>aj|qmwRB6A!E_7g!*@di delta 8130 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 diff --git a/_dist/nextcloud/ReactiveUI.dll b/_dist/nextcloud/ReactiveUI.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/RestSharp.dll b/_dist/nextcloud/RestSharp.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/ShimSkiaSharp.dll b/_dist/nextcloud/ShimSkiaSharp.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Splat.dll b/_dist/nextcloud/Splat.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Svg.Custom.dll b/_dist/nextcloud/Svg.Custom.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/Svg.Model.dll b/_dist/nextcloud/Svg.Model.dll old mode 100644 new mode 100755 diff --git a/_dist/nextcloud/System.Reactive.dll b/_dist/nextcloud/System.Reactive.dll old mode 100644 new mode 100755