From 9301dcb40e88437d32cfdfd1d2828e986d58c50a Mon Sep 17 00:00:00 2001 From: Chris Pulman Date: Mon, 25 Aug 2025 13:05:09 +0100 Subject: [PATCH] Update to include a Title --- .../compiling-reactive-ui/important-files.md | 5 +- .../contribute/compiling-reactive-ui/index.md | 5 +- .../compiling-reactive-ui/troubleshooting.md | 5 +- .../grammar-and-mechanics.md | 5 +- .../principles-for-content.md | 4 +- .../content-style-guide/voice-and-tone.md | 5 +- .../content-style-guide/word-list.md | 6 +- .../writing-about-people.md | 6 +- .../content-style-guide/writing-blog-posts.md | 6 +- .../writing-email-newsletters.md | 6 +- .../writing-for-social-media.md | 6 +- .../writing-legal-content.md | 6 +- reactiveui/contribute/design/index.md | 3 +- .../developer-experience/help-wanted.md | 6 +- .../developer-experience/the-pitch.md | 2 +- .../developer-experience/the-plan.md | 4 +- .../submitting-a-pull-request.md | 6 +- .../testing-your-changes.md | 6 +- .../accountability-and-expectations.md | 6 +- .../contribute/maintainers/approval-tests.md | 6 +- .../maintainers/avoiding-burnout.md | 5 +- .../semantic-versioning.md | 5 +- .../creating-a-new-release/troubleshooting.md | 5 +- .../creating-a-new-release/workflow.md | 4 +- ...lematic-or-disruptive-community-members.md | 5 +- .../maintainers/merging-pull-requests.md | 7 +- .../maintainers/minimum-supported-version.md | 5 +- .../maintainers/platform-knowledge/android.md | 7 - .../maintainers/platform-knowledge/toc.yml | 4 - .../platform-knowledge/xamarin-forms.md | 14 -- .../contribute/maintainers/team-management.md | 5 +- reactiveui/contribute/maintainers/toc.yml | 2 - .../maintainers/traiging-github-issues.md | 6 +- reactiveui/contribute/marketing/index.md | 5 +- .../software-style-guide/breaking-changes.md | 4 +- .../software-style-guide/code-style.md | 5 +- .../commit-message-convention.md | 7 +- .../software-style-guide/license-headers.md | 5 +- .../getting-started/compelling-example.md | 4 +- reactiveui/docs/getting-started/index.md | 1 + .../getting-started/installation/avalonia.md | 4 +- .../getting-started/installation/blazor.md | 4 +- .../getting-started/installation/tizen.md | 3 +- .../installation/windows-forms.md | 4 +- .../windows-presentation-foundation.md | 4 +- .../getting-started/installation/winui.md | 4 +- .../installation/xamarin-android.md | 4 +- .../installation/xamarin-forms.md | 4 +- .../installation/xamarin-ios.md | 4 +- .../installation/xamarin-mac.md | 4 +- .../docs/getting-started/minimum-versions.md | 3 +- .../guidelines/debugging/debug-symbols.md | 1 + .../debugging/disable-just-my-code.md | 3 +- .../enable-break-on-first-exception.md | 3 +- .../debugging/enable-framework-logging.md | 3 +- .../docs/guidelines/debugging/threading.md | 5 +- .../framework/asynchronous-commands.md | 3 +- .../guidelines/framework/command-execution.md | 3 +- .../guidelines/framework/command-names.md | 3 +- .../docs/guidelines/framework/commands.md | 3 +- .../framework/dispose-your-subscriptions.md | 3 +- .../framework/performance-optimization.md | 3 +- .../framework/prefer-oaph-over-properties.md | 3 +- .../framework/ui-thread-and-schedulers.md | 2 +- .../use-descriptive-variables-with-whenany.md | 2 +- .../framework/use-this-on-left-of-whenany.md | 3 +- reactiveui/docs/guidelines/index.md | 5 +- reactiveui/docs/guidelines/platform/blazor.md | 5 +- reactiveui/docs/guidelines/platform/tizen.md | 3 +- .../docs/guidelines/platform/windows-forms.md | 3 +- .../windows-presentation-framework.md | 4 +- .../guidelines/platform/xamarin-android.md | 4 +- .../docs/guidelines/platform/xamarin-forms.md | 4 +- .../docs/guidelines/platform/xamarin-ios.md | 4 +- .../docs/guidelines/platform/xamarin-mac.md | 4 +- reactiveui/docs/handbook/collections.md | 5 +- .../handbook/commands/binding-commands.md | 5 +- .../docs/handbook/commands/canceling.md | 5 +- reactiveui/docs/handbook/commands/index.md | 5 +- .../docs/handbook/data-binding/avalonia.md | 5 +- .../docs/handbook/data-binding/index.md | 5 +- .../handbook/data-binding/value-converters.md | 5 +- .../handbook/data-binding/windows-forms.md | 5 +- .../windows-presentation-foundation.md | 5 +- .../handbook/data-binding/xamarin-forms.md | 5 +- .../docs/handbook/data-binding/xamarin-ios.md | 5 +- reactiveui/docs/handbook/data-persistence.md | 5 +- .../handbook/default-exception-handler.md | 5 +- .../custom-dependency-inversion.md | 5 +- .../handbook/dependency-inversion/index.md | 5 +- reactiveui/docs/handbook/design-time.md | 5 +- reactiveui/docs/handbook/events.md | 5 +- .../interactions/binding-interactions.md | 5 +- .../docs/handbook/interactions/index.md | 5 +- reactiveui/docs/handbook/logging/index.md | 5 +- reactiveui/docs/handbook/message-bus.md | 5 +- .../handbook/observable-as-property-helper.md | 161 +++++++----------- reactiveui/docs/handbook/routing.md | 5 +- reactiveui/docs/handbook/scheduling.md | 5 +- reactiveui/docs/handbook/snippets.md | 5 +- reactiveui/docs/handbook/testing.md | 5 +- .../docs/handbook/user-input-validation.md | 7 +- .../view-location/extending-iviewfor.md | 7 +- .../docs/handbook/view-location/index.md | 5 +- .../handbook/view-models/boilerplate-code.md | 3 - reactiveui/docs/handbook/view-models/index.md | 5 +- reactiveui/docs/handbook/when-activated.md | 5 +- reactiveui/docs/handbook/when-any.md | 7 +- reactiveui/docs/index.md | 4 +- reactiveui/docs/reactive-programming/index.md | 2 +- .../docs/reactive-programming/videos.md | 5 +- reactiveui/docs/resources/blogs.md | 5 +- reactiveui/docs/resources/in-the-news.md | 2 +- reactiveui/docs/resources/podcasts.md | 2 +- reactiveui/docs/resources/presentations.md | 2 +- reactiveui/docs/resources/samples.md | 3 +- reactiveui/docs/resources/videos.md | 4 +- reactiveui/docs/roadmap/index.md | 4 +- reactiveui/docs/security/index.md | 5 +- reactiveui/docs/upgrading/index.md | 5 +- 120 files changed, 235 insertions(+), 463 deletions(-) delete mode 100644 reactiveui/contribute/maintainers/platform-knowledge/android.md delete mode 100644 reactiveui/contribute/maintainers/platform-knowledge/toc.yml delete mode 100644 reactiveui/contribute/maintainers/platform-knowledge/xamarin-forms.md diff --git a/reactiveui/contribute/compiling-reactive-ui/important-files.md b/reactiveui/contribute/compiling-reactive-ui/important-files.md index 54999a04d..2d7016ee3 100644 --- a/reactiveui/contribute/compiling-reactive-ui/important-files.md +++ b/reactiveui/contribute/compiling-reactive-ui/important-files.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Important files in the ReactiveUI repository + ## directory.build.props * https://github.com/reactiveui/ReactiveUI/blob/develop/src/Directory.build.props * Used to define common properties (Copyright, PackageLicenseUrl, PackageTags) used in packaging projects. diff --git a/reactiveui/contribute/compiling-reactive-ui/index.md b/reactiveui/contribute/compiling-reactive-ui/index.md index ce5a94260..208b81cd3 100644 --- a/reactiveui/contribute/compiling-reactive-ui/index.md +++ b/reactiveui/contribute/compiling-reactive-ui/index.md @@ -1,7 +1,4 @@ ---- -NoTitle: true -Title: Compiling ---- +# Compiling 0. ReactiveUI will not build correctly on Visual Studio for Mac as of 22/08/2017 building for multiple TFM's is not implemented nor working in Visual Studio for Mac. Only netstandard is compiled. diff --git a/reactiveui/contribute/compiling-reactive-ui/troubleshooting.md b/reactiveui/contribute/compiling-reactive-ui/troubleshooting.md index dfbf0df19..c12b96f1e 100644 --- a/reactiveui/contribute/compiling-reactive-ui/troubleshooting.md +++ b/reactiveui/contribute/compiling-reactive-ui/troubleshooting.md @@ -1,7 +1,4 @@ ---- -NoTitle: true -Title: Troubleshooting ---- +# Troubleshooting ## Binary Logging ReactiveUI [uses the binary logger feature](https://github.com/reactiveui/ReactiveUI/blob/72b4921d0b60d55b795474c2f7a03918a85fb150/build.cake#L214) which was made available from msbuild v15.3 onwards to output all build events to a structured/binary log file. diff --git a/reactiveui/contribute/content-style-guide/grammar-and-mechanics.md b/reactiveui/contribute/content-style-guide/grammar-and-mechanics.md index 040ba4bb5..8b1a641f4 100644 --- a/reactiveui/contribute/content-style-guide/grammar-and-mechanics.md +++ b/reactiveui/contribute/content-style-guide/grammar-and-mechanics.md @@ -1,7 +1,4 @@ ---- -NoTitle: true -Title: Grammar and Mechanics ---- +# Grammar and Mechanics Adhering to certain rules of grammar and mechanics helps us keep our writing clear and consistent. This section will lay out our house style, which applies to all of our content unless otherwise noted in this guide. (We cover a lot of ground in this section—the search feature will help if you're looking for something in particular.) diff --git a/reactiveui/contribute/content-style-guide/principles-for-content.md b/reactiveui/contribute/content-style-guide/principles-for-content.md index 4523bfbb8..151f8eeb9 100644 --- a/reactiveui/contribute/content-style-guide/principles-for-content.md +++ b/reactiveui/contribute/content-style-guide/principles-for-content.md @@ -1,10 +1,8 @@ --- -NoTitle: true -Title: Principles For Content Order: 0 --- -## Principles +# Principles Good content is: diff --git a/reactiveui/contribute/content-style-guide/voice-and-tone.md b/reactiveui/contribute/content-style-guide/voice-and-tone.md index f4f894c24..5521656d3 100644 --- a/reactiveui/contribute/content-style-guide/voice-and-tone.md +++ b/reactiveui/contribute/content-style-guide/voice-and-tone.md @@ -1,7 +1,4 @@ ---- -NoTitle: true -Title: Voice and Tone ---- +# Voice and Tone One way we write empowering content is by being aware of our voice and our tone. This section explains the difference between voice and tone, and lays out the elements of each as they apply to ReactiveUI. diff --git a/reactiveui/contribute/content-style-guide/word-list.md b/reactiveui/contribute/content-style-guide/word-list.md index 12514d795..6df149c05 100644 --- a/reactiveui/contribute/content-style-guide/word-list.md +++ b/reactiveui/contribute/content-style-guide/word-list.md @@ -1,7 +1,5 @@ ---- -NoTitle: true -Title: Style Guide - Words ---- +# Style Guide - Words + These words can be slippery. Here’s how we write them. * add-on (noun, adjective), add on (verb) diff --git a/reactiveui/contribute/content-style-guide/writing-about-people.md b/reactiveui/contribute/content-style-guide/writing-about-people.md index 4967f348b..affcad712 100644 --- a/reactiveui/contribute/content-style-guide/writing-about-people.md +++ b/reactiveui/contribute/content-style-guide/writing-about-people.md @@ -1,8 +1,4 @@ ---- -NoTitle: true -Title: Writing About People ---- -## Writing About People +# Writing About People We write the same way we build apps: with a person-first perspective. Whether you’re writing for an internal or external audience, it's important to write for and about other people in a way that’s compassionate, inclusive, and respectful. Being aware of the impact of your language will help make ReactiveUI a better open-source project. In this section we'll lay out some guidelines for writing about people with compassion, and share some resources for further learning. diff --git a/reactiveui/contribute/content-style-guide/writing-blog-posts.md b/reactiveui/contribute/content-style-guide/writing-blog-posts.md index 23daf64e6..a50a44cb6 100644 --- a/reactiveui/contribute/content-style-guide/writing-blog-posts.md +++ b/reactiveui/contribute/content-style-guide/writing-blog-posts.md @@ -1,7 +1,5 @@ ---- -NoTitle: true -Title: Blogging Guidelines ---- +# Blogging Guidelines + ReactiveUI's blog posts are written by people from from all walks of life. We love having maintainers, contributors and businesses blog about their experiences with programming in an reactive manner. The person most familiar with the subject is in the best position to convey it. ## Basics diff --git a/reactiveui/contribute/content-style-guide/writing-email-newsletters.md b/reactiveui/contribute/content-style-guide/writing-email-newsletters.md index 86ecf5b9c..da7df7f7a 100644 --- a/reactiveui/contribute/content-style-guide/writing-email-newsletters.md +++ b/reactiveui/contribute/content-style-guide/writing-email-newsletters.md @@ -1,7 +1,5 @@ ---- -NoTitle: true -Title: Email Newsletters ---- +# Email Newsletters + As devices shrink and the inbox evolves, the oldest tip is still the most important: Only send when you have something to say. ## Basics diff --git a/reactiveui/contribute/content-style-guide/writing-for-social-media.md b/reactiveui/contribute/content-style-guide/writing-for-social-media.md index d378a0079..15170d575 100644 --- a/reactiveui/contribute/content-style-guide/writing-for-social-media.md +++ b/reactiveui/contribute/content-style-guide/writing-for-social-media.md @@ -1,7 +1,5 @@ ---- -NoTitle: true -Title: Social media ---- +# Social media + We use social media to build relationships with ReactiveUI users and share all the cool stuff we do. But it also creates opportunities to say the wrong thing, put off developers, and damage our brand. So we’re careful and deliberate in what we post to our social channels. This section lays out how we strike that delicate balance. ## Basics diff --git a/reactiveui/contribute/content-style-guide/writing-legal-content.md b/reactiveui/contribute/content-style-guide/writing-legal-content.md index 7042e50d1..09bb63b85 100644 --- a/reactiveui/contribute/content-style-guide/writing-legal-content.md +++ b/reactiveui/contribute/content-style-guide/writing-legal-content.md @@ -1,7 +1,5 @@ ---- -NoTitle: true -Title: Legal Content ---- +# Legal Content + ReactiveUI publishes many kinds of legal content to protect ourselves and our users around the world. Most of our legal content is written by the .NET Foundation and their lawyers. This section gives a general overview of the types of legal content we publish and how those documents are written. ## Basics diff --git a/reactiveui/contribute/design/index.md b/reactiveui/contribute/design/index.md index 1c7a3e2d6..42c3c990f 100644 --- a/reactiveui/contribute/design/index.md +++ b/reactiveui/contribute/design/index.md @@ -1,5 +1,6 @@ --- -NoTitle: true Order: 100 --- +# Design + [See Design](https://github.com/reactiveui/website/issues?q=is%3Aissue+is%3Aopen+label%3Adesign) diff --git a/reactiveui/contribute/developer-experience/help-wanted.md b/reactiveui/contribute/developer-experience/help-wanted.md index 7427efdeb..a63a86de3 100644 --- a/reactiveui/contribute/developer-experience/help-wanted.md +++ b/reactiveui/contribute/developer-experience/help-wanted.md @@ -1,7 +1,5 @@ ---- -NoTitle: true -Title: Help Wanted ---- +# Help Wanted + Read the plan first. This page needs fleshing out, pretty much every interaction we have. If you have questions PR the answers here. It's the onboarding guide for other people who may wish to help with documentation: diff --git a/reactiveui/contribute/developer-experience/the-pitch.md b/reactiveui/contribute/developer-experience/the-pitch.md index 7a176c7be..66204bd30 100644 --- a/reactiveui/contribute/developer-experience/the-pitch.md +++ b/reactiveui/contribute/developer-experience/the-pitch.md @@ -1,7 +1,7 @@ --- -NoTitle: true Order: 0 --- +# The Pitch Knowledge of reactive programming changes you as a developer, makes you better and aligns your career with where the industry is going. One of the cool things about reactive programming is that the knowledge is _universal across programming languages_. diff --git a/reactiveui/contribute/developer-experience/the-plan.md b/reactiveui/contribute/developer-experience/the-plan.md index d2699146b..4fc695841 100644 --- a/reactiveui/contribute/developer-experience/the-plan.md +++ b/reactiveui/contribute/developer-experience/the-plan.md @@ -1,8 +1,8 @@ --- -NoTitle: true -Title: The Plan (tm) Order: 100 --- +# The Plan + ReactiveUI is the father of the extremely popular ReactiveCocoa AKA "RAC" (and also by extension ReactiveSwift) which literaly transformed and changed the way iOS software development is done. Whilst Anaïs was working at GitHub, the team behind ReactiveCocoa (also GitHub employees) ported the concepts behind ReactiveUI to iOS via much beer and coffee :-) * https://github.com/ReactiveCocoa/ReactiveCocoa (19,975 stars, 3,565 forks) diff --git a/reactiveui/contribute/features-and-patches/submitting-a-pull-request.md b/reactiveui/contribute/features-and-patches/submitting-a-pull-request.md index 39d7bee94..858b4694c 100644 --- a/reactiveui/contribute/features-and-patches/submitting-a-pull-request.md +++ b/reactiveui/contribute/features-and-patches/submitting-a-pull-request.md @@ -1,7 +1,5 @@ ---- -NoTitle: true -Title: Submitting a Pull Request ---- +# Submitting a Pull Request + Before you submit your pull request, please: * If you are considering submitting a pull-request that is more than a simple fix, open a discussion on GitHub first with your proposal. diff --git a/reactiveui/contribute/features-and-patches/testing-your-changes.md b/reactiveui/contribute/features-and-patches/testing-your-changes.md index 9b8954d69..d61b7c57e 100644 --- a/reactiveui/contribute/features-and-patches/testing-your-changes.md +++ b/reactiveui/contribute/features-and-patches/testing-your-changes.md @@ -1,7 +1,5 @@ ---- -NoTitle: true -Title: Testing Your Changes ---- +# Testing Your Changes + ## Approval Tests Approval tests are run to make sure that changes to the public API surface are known about. Currently, this covers the Blend, Forms, Testing and .Net 462 / Net Core API surfaces. diff --git a/reactiveui/contribute/maintainers/accountability-and-expectations.md b/reactiveui/contribute/maintainers/accountability-and-expectations.md index ff13b1383..4fda84769 100644 --- a/reactiveui/contribute/maintainers/accountability-and-expectations.md +++ b/reactiveui/contribute/maintainers/accountability-and-expectations.md @@ -1,7 +1,5 @@ ---- -NoTitle: true -Title: Accountability-and-expectations ---- +# Accountability-and-expectations + A great software engineering team is vital for the success of a Open Source Project. Therefore, many resources, time, and knowledge go into improving their performance, making them more productive and creative, and rightfully so. diff --git a/reactiveui/contribute/maintainers/approval-tests.md b/reactiveui/contribute/maintainers/approval-tests.md index f34174293..a5e7d7917 100644 --- a/reactiveui/contribute/maintainers/approval-tests.md +++ b/reactiveui/contribute/maintainers/approval-tests.md @@ -1,7 +1,5 @@ ---- -NoTitle: true ---- -## Approval Tests +# Approval Tests + Approval tests are run to make sure that changes to the public API surface are known about. Currently, this covers the Blend, Forms, Testing and .Net 462 and .Net 6 API surfaces. These are included in `ReactiveUI.Tests\API\ApiApprovalTests.cs`. diff --git a/reactiveui/contribute/maintainers/avoiding-burnout.md b/reactiveui/contribute/maintainers/avoiding-burnout.md index fe409b84c..4f2449901 100644 --- a/reactiveui/contribute/maintainers/avoiding-burnout.md +++ b/reactiveui/contribute/maintainers/avoiding-burnout.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Avoiding Burnout + * Don't go dark, use the weekly standup as an opportunity to ask for help or say that you'll be taking a break. * https://docs.brew.sh/Maintainers-Avoiding-Burnout.html * https://gist.github.com/ryanflorence/124070e7c4b3839d4573 diff --git a/reactiveui/contribute/maintainers/creating-a-new-release/semantic-versioning.md b/reactiveui/contribute/maintainers/creating-a-new-release/semantic-versioning.md index 3fe8a1a7d..652d4c4c2 100644 --- a/reactiveui/contribute/maintainers/creating-a-new-release/semantic-versioning.md +++ b/reactiveui/contribute/maintainers/creating-a-new-release/semantic-versioning.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Semantic Versioning + Semantic versioning is all about releases, our continuous integration infrastructure uses [GitVersion](https://gitversion.readthedocs.io) to automatically version our releases [as per the configuration](https://github.com/reactiveui/ReactiveUI/blob/develop/GitVersion.yml). For maintainer sanity, we version ReactiveUI and package as a pinned group - all packages in a release will always be the same version and only work with that version which makes it impossible for a consumer to run into situations where they use `reactiveui-core` at `7.1.0` but `reactiveui-xamforms` at `7.0.0`. Additionally all assemblies share the same [CommonAssemblyInfo.cs](https://github.com/reactiveui/ReactiveUI/blob/develop/src/CommonAssemblyInfo.cs) which is updated just before compile time by the build infrastructure. diff --git a/reactiveui/contribute/maintainers/creating-a-new-release/troubleshooting.md b/reactiveui/contribute/maintainers/creating-a-new-release/troubleshooting.md index 96b42776d..863c7dbb3 100644 --- a/reactiveui/contribute/maintainers/creating-a-new-release/troubleshooting.md +++ b/reactiveui/contribute/maintainers/creating-a-new-release/troubleshooting.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Troubleshooting a failed release + ## Version wasn't bumped when merging from develop into main You'll need to do a pull-request similar to this [https://github.com/reactiveui/ReactiveUI/pull/1226](https://github.com/reactiveui/ReactiveUI/pull/1226) diff --git a/reactiveui/contribute/maintainers/creating-a-new-release/workflow.md b/reactiveui/contribute/maintainers/creating-a-new-release/workflow.md index 18df91fc9..bb8505034 100644 --- a/reactiveui/contribute/maintainers/creating-a-new-release/workflow.md +++ b/reactiveui/contribute/maintainers/creating-a-new-release/workflow.md @@ -1,6 +1,4 @@ ---- -NoTitle: true ---- +# Workflow for Creating a New Release ## Development diff --git a/reactiveui/contribute/maintainers/dealing-with-angry-negative-problematic-or-disruptive-community-members.md b/reactiveui/contribute/maintainers/dealing-with-angry-negative-problematic-or-disruptive-community-members.md index a57742a9a..67752a116 100644 --- a/reactiveui/contribute/maintainers/dealing-with-angry-negative-problematic-or-disruptive-community-members.md +++ b/reactiveui/contribute/maintainers/dealing-with-angry-negative-problematic-or-disruptive-community-members.md @@ -1,7 +1,4 @@ ---- -NoTitle: true -Title: Dealing with Angry, Negative, Problematic or Disruptive community members ---- +# Dealing with Angry, Negative, Problematic or Disruptive community members GitHub's [recent research](https://opensourcesurvey.org/2017/) has shown that even witnessing these negative interactions can be costing our project of consumers stepping up to become contributors: diff --git a/reactiveui/contribute/maintainers/merging-pull-requests.md b/reactiveui/contribute/maintainers/merging-pull-requests.md index 82ff76e1a..6f4608e13 100644 --- a/reactiveui/contribute/maintainers/merging-pull-requests.md +++ b/reactiveui/contribute/maintainers/merging-pull-requests.md @@ -1,6 +1,7 @@ ---- -NoTitle: true ---- +# Merging Pull Requests + +When a pull-request is ready to be merged, please follow these steps to ensure a smooth and consistent process. + 1. Assign one or more labels to categorize what component of ReactiveUI was changed by this unit of work. ![](~/images/apply-one-or-more-labels.png) 2. Rename the title of the GitHub issue to match [our convention](~/contribute/software-style-guide/commit-message-convention.md). ![](~/images/rename-the-title.png) diff --git a/reactiveui/contribute/maintainers/minimum-supported-version.md b/reactiveui/contribute/maintainers/minimum-supported-version.md index 589ae1719..2e355162d 100644 --- a/reactiveui/contribute/maintainers/minimum-supported-version.md +++ b/reactiveui/contribute/maintainers/minimum-supported-version.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Minimum Supported Version + Be extremely conversative about bumping the minimum supported version of ReactiveUI and any dependencies such as splat or system.reactive. Please ensure that you aren't breaking the ecosystem, there's a migration path and no rift is created (python 2 vs python 3) that people can fall into. With that said however this is an open-source project and typically folks who are stuck on older versions work at enterprise companies. Maintainers have zero obligations to requests from this demographic - our software is made available in binary and source form on a AS-IS basis. Often we will accomodate such requests to keep a platform around longer if the request comes from a maintainer or a respected community member who is actively engaged in helping make ReactiveUI better. diff --git a/reactiveui/contribute/maintainers/platform-knowledge/android.md b/reactiveui/contribute/maintainers/platform-knowledge/android.md deleted file mode 100644 index 51958c242..000000000 --- a/reactiveui/contribute/maintainers/platform-knowledge/android.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -NoTitle: true ---- - -When going from v7 to v8 to v9 you'll need to adjust this pin - -https://github.com/reactiveui/ReactiveUI/pull/1520/files#diff-6cfa8e971d51053620e8a9916d81e5d7R33D diff --git a/reactiveui/contribute/maintainers/platform-knowledge/toc.yml b/reactiveui/contribute/maintainers/platform-knowledge/toc.yml deleted file mode 100644 index e94cf0a9c..000000000 --- a/reactiveui/contribute/maintainers/platform-knowledge/toc.yml +++ /dev/null @@ -1,4 +0,0 @@ -- name: Android - href: Android.md -- name: Xamarin Forms - href: xamarin-forms.md diff --git a/reactiveui/contribute/maintainers/platform-knowledge/xamarin-forms.md b/reactiveui/contribute/maintainers/platform-knowledge/xamarin-forms.md deleted file mode 100644 index 1510be854..000000000 --- a/reactiveui/contribute/maintainers/platform-knowledge/xamarin-forms.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -NoTitle: true ---- -## When to bump? - -https://github.com/reactiveui/rfcs/issues/7 - -## Bumping Version - -Adjust these three things: - -- https://github.com/reactiveui/ReactiveUI/blob/dc44b2d321b30453af4c45a94162a6df83c39183/src/EventBuilder/Platforms/XamForms.cs#L42 -- https://github.com/reactiveui/ReactiveUI/blob/dc44b2d321b30453af4c45a94162a6df83c39183/src/ReactiveUI.Events.XamForms/ReactiveUI.Events.XamForms.csproj#L18 -- https://github.com/reactiveui/ReactiveUI/blob/dc44b2d321b30453af4c45a94162a6df83c39183/src/ReactiveUI.XamForms/ReactiveUI.XamForms.csproj#L10 diff --git a/reactiveui/contribute/maintainers/team-management.md b/reactiveui/contribute/maintainers/team-management.md index c7fb13cbd..f06cd95a9 100644 --- a/reactiveui/contribute/maintainers/team-management.md +++ b/reactiveui/contribute/maintainers/team-management.md @@ -1,7 +1,4 @@ ---- -NoTitle: true ---- -## Team Management +# Team Management When a pull-request is created GitHub evaulates which files have been changed [as per these rules](https://github.com/reactiveui/ReactiveUI/blob/main/.github/CODEOWNERS ). For more information about the `CODEOWNERS` convention [refer to this page on GitHub](https://help.github.com/articles/about-codeowners/) or refer to the sample below diff --git a/reactiveui/contribute/maintainers/toc.yml b/reactiveui/contribute/maintainers/toc.yml index b7f3b1d97..d371d95b6 100644 --- a/reactiveui/contribute/maintainers/toc.yml +++ b/reactiveui/contribute/maintainers/toc.yml @@ -15,8 +15,6 @@ href: merging-pull-requests.md - name: Minimum Supported Version href: minimum-supported-version.md -- name: platform-knowledge - href: platform-knowledge/toc.yml - name: Reviewing pull requests href: reviewing-pull-requests.md - name: Team management diff --git a/reactiveui/contribute/maintainers/traiging-github-issues.md b/reactiveui/contribute/maintainers/traiging-github-issues.md index ce5e235f3..acd6974bd 100644 --- a/reactiveui/contribute/maintainers/traiging-github-issues.md +++ b/reactiveui/contribute/maintainers/traiging-github-issues.md @@ -1,7 +1,5 @@ ---- -NoTitle: true -Title: Triaging GitHub issues ---- +# Triaging GitHub issues + @inherits StatiqRazorPage
  • housekeeping and proposal labels won't be autoclosed
  • diff --git a/reactiveui/contribute/marketing/index.md b/reactiveui/contribute/marketing/index.md index beec90054..715cca692 100644 --- a/reactiveui/contribute/marketing/index.md +++ b/reactiveui/contribute/marketing/index.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Marketing for Engineers + @inherits StatiqRazorPage Website stats https://clicky.com/stats/?site_id=100909170 diff --git a/reactiveui/contribute/software-style-guide/breaking-changes.md b/reactiveui/contribute/software-style-guide/breaking-changes.md index b073e22a2..70133afc3 100644 --- a/reactiveui/contribute/software-style-guide/breaking-changes.md +++ b/reactiveui/contribute/software-style-guide/breaking-changes.md @@ -1,6 +1,4 @@ ---- -NoTitle: true ---- +# Breaking Changes Like we should make no assumptions that people even know what a breaking change is.... many people never had to worry about framework concerns before in their life. provide some form of automation (approval tests) then link off to a (currently non-existent) document in the contribution section. diff --git a/reactiveui/contribute/software-style-guide/code-style.md b/reactiveui/contribute/software-style-guide/code-style.md index 3b1fbe658..b35d6b637 100644 --- a/reactiveui/contribute/software-style-guide/code-style.md +++ b/reactiveui/contribute/software-style-guide/code-style.md @@ -1,9 +1,8 @@ --- -NoTitle: true Order: 0 --- -C# Style Guide -=============== +# C# Style Guide + The general rule we follow is "use Visual Studio defaults". diff --git a/reactiveui/contribute/software-style-guide/commit-message-convention.md b/reactiveui/contribute/software-style-guide/commit-message-convention.md index 511e69229..efe0b29d9 100644 --- a/reactiveui/contribute/software-style-guide/commit-message-convention.md +++ b/reactiveui/contribute/software-style-guide/commit-message-convention.md @@ -1,10 +1,9 @@ ---- -NoTitle: true ---- +# Commit Message Convention + Each commit message consists of a **header**, a **body** and a **footer**. The header has a special format that includes a **type** and a **subject**: -``` +```xml : diff --git a/reactiveui/contribute/software-style-guide/license-headers.md b/reactiveui/contribute/software-style-guide/license-headers.md index 0d2d63184..ecda7a691 100644 --- a/reactiveui/contribute/software-style-guide/license-headers.md +++ b/reactiveui/contribute/software-style-guide/license-headers.md @@ -1,4 +1,3 @@ ---- -NoTitle: true ---- +# License Headers + ReactiveUI projects use Stylecop and is installed from Nuget, all new files must have the license added to the top, the lack of the Header will result in a build failure. Please use the Stylecop Analyser suggestions to ensure the correct header is inserted. diff --git a/reactiveui/docs/getting-started/compelling-example.md b/reactiveui/docs/getting-started/compelling-example.md index e29b5078c..6c7ad4e84 100644 --- a/reactiveui/docs/getting-started/compelling-example.md +++ b/reactiveui/docs/getting-started/compelling-example.md @@ -1,6 +1,4 @@ ---- -Title: A Compelling Example ---- +# A Compelling Example Let's create a simple application demonstrating a number of ReactiveUI functionalities, without getting into too many under-the-hood details. We will create a WPF application, which will allow us to search through NuGet public repositories. The full code of the application is shown at the end of this chapter, and we will show relevant snippets as we go. diff --git a/reactiveui/docs/getting-started/index.md b/reactiveui/docs/getting-started/index.md index d137c103f..d2081f774 100644 --- a/reactiveui/docs/getting-started/index.md +++ b/reactiveui/docs/getting-started/index.md @@ -1,3 +1,4 @@ +# Getting Started with ReactiveUI ReactiveUI gives you the power to build reactive, testable, and composable UI code using the MVVM pattern. diff --git a/reactiveui/docs/getting-started/installation/avalonia.md b/reactiveui/docs/getting-started/installation/avalonia.md index 2a9c372c3..3abe60a3d 100644 --- a/reactiveui/docs/getting-started/installation/avalonia.md +++ b/reactiveui/docs/getting-started/installation/avalonia.md @@ -1,6 +1,4 @@ ---- -Title: Avalonia ---- +# Avalonia
    diff --git a/reactiveui/docs/getting-started/installation/blazor.md b/reactiveui/docs/getting-started/installation/blazor.md index dd641030b..1c51db3d7 100644 --- a/reactiveui/docs/getting-started/installation/blazor.md +++ b/reactiveui/docs/getting-started/installation/blazor.md @@ -1,6 +1,4 @@ ---- -Title: Blazor ---- +# Blazor # Package Installation diff --git a/reactiveui/docs/getting-started/installation/tizen.md b/reactiveui/docs/getting-started/installation/tizen.md index fdc3ff045..7039918c5 100644 --- a/reactiveui/docs/getting-started/installation/tizen.md +++ b/reactiveui/docs/getting-started/installation/tizen.md @@ -1,8 +1,7 @@ --- -NoTitle: true -Title: Tizen Order: 80 --- +# Tizen ## Package Installation diff --git a/reactiveui/docs/getting-started/installation/windows-forms.md b/reactiveui/docs/getting-started/installation/windows-forms.md index 5d83fe2fe..b7f25ba06 100644 --- a/reactiveui/docs/getting-started/installation/windows-forms.md +++ b/reactiveui/docs/getting-started/installation/windows-forms.md @@ -1,6 +1,4 @@ ---- -Title: Windows Forms ---- +# Windows Forms ## Package Installation diff --git a/reactiveui/docs/getting-started/installation/windows-presentation-foundation.md b/reactiveui/docs/getting-started/installation/windows-presentation-foundation.md index 471372138..0ab01f47a 100644 --- a/reactiveui/docs/getting-started/installation/windows-presentation-foundation.md +++ b/reactiveui/docs/getting-started/installation/windows-presentation-foundation.md @@ -1,6 +1,4 @@ ---- -Title: Windows Presentation Foundation ---- +# Windows Presentation Foundation ## Package Installation diff --git a/reactiveui/docs/getting-started/installation/winui.md b/reactiveui/docs/getting-started/installation/winui.md index b04288a4e..469b5aef5 100644 --- a/reactiveui/docs/getting-started/installation/winui.md +++ b/reactiveui/docs/getting-started/installation/winui.md @@ -1,6 +1,4 @@ ---- -Title: WinUI ---- +# WinUI ## Package Installation diff --git a/reactiveui/docs/getting-started/installation/xamarin-android.md b/reactiveui/docs/getting-started/installation/xamarin-android.md index 3f9688cd6..6714dfa1c 100644 --- a/reactiveui/docs/getting-started/installation/xamarin-android.md +++ b/reactiveui/docs/getting-started/installation/xamarin-android.md @@ -1,6 +1,4 @@ ---- -Title: Xamarin Android ---- +# Xamarin Android ## Package Installation diff --git a/reactiveui/docs/getting-started/installation/xamarin-forms.md b/reactiveui/docs/getting-started/installation/xamarin-forms.md index 9611d32b1..51ee9a6c4 100644 --- a/reactiveui/docs/getting-started/installation/xamarin-forms.md +++ b/reactiveui/docs/getting-started/installation/xamarin-forms.md @@ -1,6 +1,4 @@ ---- -Title: Xamarin Forms ---- +# Xamarin Forms ## Package Installation diff --git a/reactiveui/docs/getting-started/installation/xamarin-ios.md b/reactiveui/docs/getting-started/installation/xamarin-ios.md index 3f8881287..3d53089d0 100644 --- a/reactiveui/docs/getting-started/installation/xamarin-ios.md +++ b/reactiveui/docs/getting-started/installation/xamarin-ios.md @@ -1,6 +1,4 @@ ---- -Title: Xamarin iOS ---- +# Xamarin iOS ## Package Installation diff --git a/reactiveui/docs/getting-started/installation/xamarin-mac.md b/reactiveui/docs/getting-started/installation/xamarin-mac.md index e224edf77..60266672d 100644 --- a/reactiveui/docs/getting-started/installation/xamarin-mac.md +++ b/reactiveui/docs/getting-started/installation/xamarin-mac.md @@ -1,6 +1,4 @@ ---- -Title: Xamarin Mac ---- +# Xamarin Mac ## Package Installation diff --git a/reactiveui/docs/getting-started/minimum-versions.md b/reactiveui/docs/getting-started/minimum-versions.md index feb063a18..91fdbc665 100644 --- a/reactiveui/docs/getting-started/minimum-versions.md +++ b/reactiveui/docs/getting-started/minimum-versions.md @@ -1,5 +1,4 @@ - -## Visual Studio Minimums +# Visual Studio Minimums Visual Studio 2022 and beyond. diff --git a/reactiveui/docs/guidelines/debugging/debug-symbols.md b/reactiveui/docs/guidelines/debugging/debug-symbols.md index 6d00adc4a..fcfeff4a4 100644 --- a/reactiveui/docs/guidelines/debugging/debug-symbols.md +++ b/reactiveui/docs/guidelines/debugging/debug-symbols.md @@ -1,3 +1,4 @@ +# Debugging ReactiveUI We use [SourceLink](https://docs.microsoft.com/en-us/dotnet/standard/library-guidance/sourcelink) which allows you to break and get live debugging into our code base. diff --git a/reactiveui/docs/guidelines/debugging/disable-just-my-code.md b/reactiveui/docs/guidelines/debugging/disable-just-my-code.md index 546a58e35..b42b9b2f8 100644 --- a/reactiveui/docs/guidelines/debugging/disable-just-my-code.md +++ b/reactiveui/docs/guidelines/debugging/disable-just-my-code.md @@ -1,5 +1,4 @@ - -## Visual Studio Settings +# Visual Studio Settings ## Disable Just My Code In settings of Visual Studio, disable the [Just My Code](https://msdn.microsoft.com/en-us/library/dn457346.aspx) feature _forever and ever_. Trust us on this one, it makes the debugging experience for `Observable` and `async/await/TPL` _so much better_. diff --git a/reactiveui/docs/guidelines/debugging/enable-break-on-first-exception.md b/reactiveui/docs/guidelines/debugging/enable-break-on-first-exception.md index c09223c0e..c42ebecb7 100644 --- a/reactiveui/docs/guidelines/debugging/enable-break-on-first-exception.md +++ b/reactiveui/docs/guidelines/debugging/enable-break-on-first-exception.md @@ -1,5 +1,4 @@ - -## Visual Studio for Mac +# Visual Studio for Mac This is like Rx debugging pro-tip #1: diff --git a/reactiveui/docs/guidelines/debugging/enable-framework-logging.md b/reactiveui/docs/guidelines/debugging/enable-framework-logging.md index d2dafdbf3..1f6a9a181 100644 --- a/reactiveui/docs/guidelines/debugging/enable-framework-logging.md +++ b/reactiveui/docs/guidelines/debugging/enable-framework-logging.md @@ -1,5 +1,4 @@ - -## Enable Framework Logging +# Enable Framework Logging Debug information is written by the framework to Splat. By default, [splat ships with a null logger as "Debug.WriteLine" is stripped by the compiler when Splat is packaged](https://github.com/reactiveui/splat/issues/46). Wire in an implementation of `ILogger` such as the one below to see these messages: diff --git a/reactiveui/docs/guidelines/debugging/threading.md b/reactiveui/docs/guidelines/debugging/threading.md index 3b0016bd4..f90b5fc98 100644 --- a/reactiveui/docs/guidelines/debugging/threading.md +++ b/reactiveui/docs/guidelines/debugging/threading.md @@ -1,7 +1,4 @@ ---- -NoTitle: true ---- -## Thread Troubleshooting +# Thread Troubleshooting moswald [5:04 AM] does anyone have a good way to find which property on a View is being accessed from the wrong thread? diff --git a/reactiveui/docs/guidelines/framework/asynchronous-commands.md b/reactiveui/docs/guidelines/framework/asynchronous-commands.md index 76839eede..f8a8b9e3d 100644 --- a/reactiveui/docs/guidelines/framework/asynchronous-commands.md +++ b/reactiveui/docs/guidelines/framework/asynchronous-commands.md @@ -1,5 +1,4 @@ - -## Asynchronous Commands +# Asynchronous Commands Prefer using async `ReactiveCommand` over the more basic `ReactiveCommand` for all but the most simple tasks. In ReactiveUI, you should never put Interesting™ code inside the Subscribe block - Subscribe is solely to log the result of operations, or to wire up properties to other properties. diff --git a/reactiveui/docs/guidelines/framework/command-execution.md b/reactiveui/docs/guidelines/framework/command-execution.md index 8e93243b8..2f530e397 100644 --- a/reactiveui/docs/guidelines/framework/command-execution.md +++ b/reactiveui/docs/guidelines/framework/command-execution.md @@ -1,4 +1,3 @@ - -## Command Execution +# Command Execution [A viewmodel using reactiveui 6 that loads and sends data](https://codereview.stackexchange.com/questions/74642/a-viewmodel-using-reactiveui-6-that-loads-and-sends-data) diff --git a/reactiveui/docs/guidelines/framework/command-names.md b/reactiveui/docs/guidelines/framework/command-names.md index 99ce21df1..1227582a1 100644 --- a/reactiveui/docs/guidelines/framework/command-names.md +++ b/reactiveui/docs/guidelines/framework/command-names.md @@ -1,5 +1,4 @@ - -## Command Names +# Command Names Don't suffix `ReactiveCommand` properties' names with `Command`; instead, name the property using a verb that describes the command's action. For example: diff --git a/reactiveui/docs/guidelines/framework/commands.md b/reactiveui/docs/guidelines/framework/commands.md index 6f4b0c026..58d416555 100644 --- a/reactiveui/docs/guidelines/framework/commands.md +++ b/reactiveui/docs/guidelines/framework/commands.md @@ -1,5 +1,4 @@ - -## Commands +# Commands Prefer binding user interactions to commands rather than methods. diff --git a/reactiveui/docs/guidelines/framework/dispose-your-subscriptions.md b/reactiveui/docs/guidelines/framework/dispose-your-subscriptions.md index 67f69a3e6..35c915368 100644 --- a/reactiveui/docs/guidelines/framework/dispose-your-subscriptions.md +++ b/reactiveui/docs/guidelines/framework/dispose-your-subscriptions.md @@ -1,5 +1,4 @@ - -## Dispose your subscriptions +# Dispose your subscriptions [Lifetime management](http://www.introtorx.com/Content/v1.0.10621.0/03_LifetimeManagement.html) diff --git a/reactiveui/docs/guidelines/framework/performance-optimization.md b/reactiveui/docs/guidelines/framework/performance-optimization.md index b93be458a..387828c1e 100644 --- a/reactiveui/docs/guidelines/framework/performance-optimization.md +++ b/reactiveui/docs/guidelines/framework/performance-optimization.md @@ -1,5 +1,4 @@ - -## Performance optimization +# Performance optimization ## Splat diff --git a/reactiveui/docs/guidelines/framework/prefer-oaph-over-properties.md b/reactiveui/docs/guidelines/framework/prefer-oaph-over-properties.md index 82c0b4827..1a509ad5e 100644 --- a/reactiveui/docs/guidelines/framework/prefer-oaph-over-properties.md +++ b/reactiveui/docs/guidelines/framework/prefer-oaph-over-properties.md @@ -1,5 +1,4 @@ - -## Prefer ObservableAsPropertyHelpers over setting properties explicitly +# Prefer ObservableAsPropertyHelpers over setting properties explicitly When a property's value depends on another property, a set of properties, or an observable stream, rather than set the value explicitly, use diff --git a/reactiveui/docs/guidelines/framework/ui-thread-and-schedulers.md b/reactiveui/docs/guidelines/framework/ui-thread-and-schedulers.md index fcaca6817..4a474428f 100644 --- a/reactiveui/docs/guidelines/framework/ui-thread-and-schedulers.md +++ b/reactiveui/docs/guidelines/framework/ui-thread-and-schedulers.md @@ -1,5 +1,5 @@ +# UI Thread and Schedulers -## UI Thread and Schedulers Always make sure to update the UI on the `RxApp.MainThreadScheduler` to ensure UI changes happen on the UI thread. In practice, this typically means making sure to update view models on the main thread scheduler. ## Do diff --git a/reactiveui/docs/guidelines/framework/use-descriptive-variables-with-whenany.md b/reactiveui/docs/guidelines/framework/use-descriptive-variables-with-whenany.md index 1b6c66601..81e749007 100644 --- a/reactiveui/docs/guidelines/framework/use-descriptive-variables-with-whenany.md +++ b/reactiveui/docs/guidelines/framework/use-descriptive-variables-with-whenany.md @@ -1,5 +1,5 @@ +# Use descriptive variables in your `WhenAny` -## Use descriptive variables in your `WhenAny` In situations where you are detecting changes in multiple expressions, ensure you name the variables in the `selector` ## Do diff --git a/reactiveui/docs/guidelines/framework/use-this-on-left-of-whenany.md b/reactiveui/docs/guidelines/framework/use-this-on-left-of-whenany.md index 3bf986e60..493dbc5c9 100644 --- a/reactiveui/docs/guidelines/framework/use-this-on-left-of-whenany.md +++ b/reactiveui/docs/guidelines/framework/use-this-on-left-of-whenany.md @@ -1,5 +1,4 @@ - -## Almost always use `this` as the left hand side of a `WhenAny` call. +# Almost always use `this` as the left hand side of a `WhenAny` call. ## Do ```csharp diff --git a/reactiveui/docs/guidelines/index.md b/reactiveui/docs/guidelines/index.md index 8397254ad..0b14a1f01 100644 --- a/reactiveui/docs/guidelines/index.md +++ b/reactiveui/docs/guidelines/index.md @@ -1,5 +1,2 @@ ---- -NoTitle: true -Title: Guidelines ---- +# Guidelines diff --git a/reactiveui/docs/guidelines/platform/blazor.md b/reactiveui/docs/guidelines/platform/blazor.md index edcea4a65..41f74d344 100644 --- a/reactiveui/docs/guidelines/platform/blazor.md +++ b/reactiveui/docs/guidelines/platform/blazor.md @@ -1,7 +1,4 @@ ---- -NoTitle: true -Title: Blazor ---- +# Blazor ## Project diff --git a/reactiveui/docs/guidelines/platform/tizen.md b/reactiveui/docs/guidelines/platform/tizen.md index 8bc8b1859..b1c1eea14 100644 --- a/reactiveui/docs/guidelines/platform/tizen.md +++ b/reactiveui/docs/guidelines/platform/tizen.md @@ -1,5 +1,4 @@ - -## Tizen +# Tizen Keep an eye on [Github](https://github.com/reactiveui/ReactiveUI/pull/1387) diff --git a/reactiveui/docs/guidelines/platform/windows-forms.md b/reactiveui/docs/guidelines/platform/windows-forms.md index e365cd1d8..09419cc71 100644 --- a/reactiveui/docs/guidelines/platform/windows-forms.md +++ b/reactiveui/docs/guidelines/platform/windows-forms.md @@ -1,5 +1,4 @@ - -## Windows Forms +# Windows Forms Ensure that you install `ReactiveUI.WinForms` into your application. diff --git a/reactiveui/docs/guidelines/platform/windows-presentation-framework.md b/reactiveui/docs/guidelines/platform/windows-presentation-framework.md index 27ae32550..638c10775 100644 --- a/reactiveui/docs/guidelines/platform/windows-presentation-framework.md +++ b/reactiveui/docs/guidelines/platform/windows-presentation-framework.md @@ -1,6 +1,4 @@ ---- -Title: Windows Presentation Framework ---- +# Windows Presentation Framework Ensure that you install `ReactiveUI.WPF` into your application. diff --git a/reactiveui/docs/guidelines/platform/xamarin-android.md b/reactiveui/docs/guidelines/platform/xamarin-android.md index e495f26d4..edfb4ecdd 100644 --- a/reactiveui/docs/guidelines/platform/xamarin-android.md +++ b/reactiveui/docs/guidelines/platform/xamarin-android.md @@ -1,6 +1,4 @@ ---- -Title: Xamarin Android ---- +# Xamarin Android Ensure that you install either `ReactiveUI.AndroidX` or `ReactiveUI.AndroidSupport` into your applications. diff --git a/reactiveui/docs/guidelines/platform/xamarin-forms.md b/reactiveui/docs/guidelines/platform/xamarin-forms.md index 4d1d17387..6bf7cb8c6 100644 --- a/reactiveui/docs/guidelines/platform/xamarin-forms.md +++ b/reactiveui/docs/guidelines/platform/xamarin-forms.md @@ -1,6 +1,4 @@ ---- -Title: Xamarin Forms ---- +# Xamarin Forms Ensure that you install `ReactiveUI.XamForms` into your applications. diff --git a/reactiveui/docs/guidelines/platform/xamarin-ios.md b/reactiveui/docs/guidelines/platform/xamarin-ios.md index e560a1536..70f415903 100644 --- a/reactiveui/docs/guidelines/platform/xamarin-ios.md +++ b/reactiveui/docs/guidelines/platform/xamarin-ios.md @@ -1,6 +1,4 @@ ---- -Title: Xamarin iOS ---- +# Xamarin iOS Your viewmodels should inherit from `ReactiveObject` diff --git a/reactiveui/docs/guidelines/platform/xamarin-mac.md b/reactiveui/docs/guidelines/platform/xamarin-mac.md index 24779e71b..59b47dea3 100644 --- a/reactiveui/docs/guidelines/platform/xamarin-mac.md +++ b/reactiveui/docs/guidelines/platform/xamarin-mac.md @@ -1,6 +1,4 @@ ---- -Title: Xamarin Mac ---- +# Xamarin Mac This platform has two different base class libraries: diff --git a/reactiveui/docs/handbook/collections.md b/reactiveui/docs/handbook/collections.md index 401c6d7dc..55da5ee7f 100644 --- a/reactiveui/docs/handbook/collections.md +++ b/reactiveui/docs/handbook/collections.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Collections in ReactiveUI + ReactiveUI recommends the use of [DynamicData](https://github.com/reactivemarbles/DynamicData) for collection based operations. > DynamicData has replaced internally the use of [ReactiveList](~/docs/handbook/obsolete/collections/reactive-list.md) diff --git a/reactiveui/docs/handbook/commands/binding-commands.md b/reactiveui/docs/handbook/commands/binding-commands.md index 7c6c1992a..d95d83787 100644 --- a/reactiveui/docs/handbook/commands/binding-commands.md +++ b/reactiveui/docs/handbook/commands/binding-commands.md @@ -1,7 +1,4 @@ ---- -NoTitle: true ---- -## Binding +# Binding Commands View model commands that need to be bound to view controls must implement the `ICommand` interface. View model commands are typically bound to view controls using one of the `BindCommand` overloads available in the view. Let's see an example: diff --git a/reactiveui/docs/handbook/commands/canceling.md b/reactiveui/docs/handbook/commands/canceling.md index 2bcc9bb3c..907fb65c6 100644 --- a/reactiveui/docs/handbook/commands/canceling.md +++ b/reactiveui/docs/handbook/commands/canceling.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Canceling Command Execution + If your command's execution logic can take a long time to complete, it can be useful to allow the execution to be canceled. This cancelation support can be used internally by your view models, or exposed so that users have a say in the matter. ## Basic Cancelation diff --git a/reactiveui/docs/handbook/commands/index.md b/reactiveui/docs/handbook/commands/index.md index 39906d5f7..4abaae2db 100644 --- a/reactiveui/docs/handbook/commands/index.md +++ b/reactiveui/docs/handbook/commands/index.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Commands + `ReactiveCommand` is a Reactive Extensions and asynchronous aware implementation of the [`ICommand`](https://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx) interface. `ICommand` is often used in the [MVVM design pattern](https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/commanding-overview) to allow the View to trigger business logic defined in the ViewModel. This allows for easier maintenance, unit testing, and the ability to reuse ViewModels across different UI frameworks. Examples of where a View might invoke a command include clicking a *Save* menu item, tapping a phone icon, or stretching an image. In these cases, the ViewModel will then invoke the business logic of saving outstanding changes, performing a phone call, or zooming into an image. ## Creating commands diff --git a/reactiveui/docs/handbook/data-binding/avalonia.md b/reactiveui/docs/handbook/data-binding/avalonia.md index 326bf99b3..2135fbab2 100644 --- a/reactiveui/docs/handbook/data-binding/avalonia.md +++ b/reactiveui/docs/handbook/data-binding/avalonia.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Data Binding in AvaloniaUI with ReactiveUI + > **Note** First of all, ensure you install the `Avalonia.ReactiveUI` package and *add a call* to `UseReactiveUI()` to your `AppBuilder` — that's super important. Note, that `Avalonia.ReactiveUI` package is supported by AvaloniaUI team, so if anything goes wrong, head over to [AvaloniaUI Gitter](https://gitter.im/AvaloniaUI/Avalonia). Also see [Avalonia.ReactiveUI Docs](https://docs.avaloniaui.net/guides/deep-dives/reactiveui). For [WhenActivated](~/docs/handbook/when-activated.md) to work, you need to use custom base classes from `Avalonia.ReactiveUI` package, such as `ReactiveWindow` or `ReactiveUserControl`. Of course, you can also implement the `IViewFor` interface by hand in your class, but ensure to store the `ViewModel` inside an `AvaloniaProperty`. If you wish to add activation support to your view models, then implement the `IActivatableViewModel` interface. A view model implementing `IActivatableViewModel` might look like the one below: diff --git a/reactiveui/docs/handbook/data-binding/index.md b/reactiveui/docs/handbook/data-binding/index.md index b18f9081d..37397f43a 100644 --- a/reactiveui/docs/handbook/data-binding/index.md +++ b/reactiveui/docs/handbook/data-binding/index.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Data Binding in ReactiveUI + A core part of being able to use the MVVM pattern is the very specific relationship between the ViewModel and View - that is, the View is connected in a one-way dependent manner to the ViewModel via *bindings*. ReactiveUI provides its own implementation of this concept, which has a number of advantages compared to platform-specific implementations such as XAML-based bindings. * Bindings work on **all platforms** and operate the same. diff --git a/reactiveui/docs/handbook/data-binding/value-converters.md b/reactiveui/docs/handbook/data-binding/value-converters.md index a80611b30..14428e5b6 100644 --- a/reactiveui/docs/handbook/data-binding/value-converters.md +++ b/reactiveui/docs/handbook/data-binding/value-converters.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Value Converters + A value converter should implement the `IBindingTypeConverter` interface. See an example of a globally registered converter type that converts between Boolean and XAML Visibility: [BooleanToVisibilityTypeConverter.cs](https://github.com/reactiveui/ReactiveUI/blob/main/src/ReactiveUI.Wpf/Common/BooleanToVisibilityTypeConverter.cs) ## How GetAffinityForObjects works diff --git a/reactiveui/docs/handbook/data-binding/windows-forms.md b/reactiveui/docs/handbook/data-binding/windows-forms.md index ea36643f9..0d992cd9e 100644 --- a/reactiveui/docs/handbook/data-binding/windows-forms.md +++ b/reactiveui/docs/handbook/data-binding/windows-forms.md @@ -1,4 +1,3 @@ ---- -NoTitle: true ---- +# Data Binding in Windows Forms with ReactiveUI + See [Using ReactiveUI for WinForms MVVM Design](https://www.codeproject.com/Articles/801986/Using-ReactiveUI-for-WinForms-MVVM-Design) diff --git a/reactiveui/docs/handbook/data-binding/windows-presentation-foundation.md b/reactiveui/docs/handbook/data-binding/windows-presentation-foundation.md index 25a171a28..62953fb77 100644 --- a/reactiveui/docs/handbook/data-binding/windows-presentation-foundation.md +++ b/reactiveui/docs/handbook/data-binding/windows-presentation-foundation.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Data Binding in WPF + Implement `IViewFor` by hand and ensure that ViewModel is a `DependencyProperty`. Also, always dispose bindings via [WhenActivated](~/docs/handbook/when-activated.md), or else the bindings leak memory. The XAML `DependencyProperty` system causes memory leaks if you don't use `WhenActivated`. There's a few rules, but the number one rule is: if you do a `WhenAny` on anything other than `this`, then you need to put it inside a `WhenActivated`. See [WhenActivated](~/docs/handbook/when-activated.md) for details. The goal in this example is to two-way bind `TheText` property of the ViewModel to the TextBox and one-way bind `TheText` property to the TextBlock, so the TextBlock updates when the user types text into the TextBox. diff --git a/reactiveui/docs/handbook/data-binding/xamarin-forms.md b/reactiveui/docs/handbook/data-binding/xamarin-forms.md index e5955d042..37d0327af 100644 --- a/reactiveui/docs/handbook/data-binding/xamarin-forms.md +++ b/reactiveui/docs/handbook/data-binding/xamarin-forms.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Data Binding in Xamarin.Forms + For Xamarin.Forms applications you need to install the ReactiveUI.XamForms [Nuget package](https://www.nuget.org/packages/ReactiveUI.XamForms/). ## ViewModels diff --git a/reactiveui/docs/handbook/data-binding/xamarin-ios.md b/reactiveui/docs/handbook/data-binding/xamarin-ios.md index a7bc513f9..32394d409 100644 --- a/reactiveui/docs/handbook/data-binding/xamarin-ios.md +++ b/reactiveui/docs/handbook/data-binding/xamarin-ios.md @@ -1,7 +1,4 @@ ---- -NoTitle: true -Title: Xamarin iOS ---- +# Data Binding in Xamarin.iOS In order to use bindings in the View, you must first implement `IViewFor` on your View. Depending on the platform, you must diff --git a/reactiveui/docs/handbook/data-persistence.md b/reactiveui/docs/handbook/data-persistence.md index eaf8e1c06..07a229f87 100644 --- a/reactiveui/docs/handbook/data-persistence.md +++ b/reactiveui/docs/handbook/data-persistence.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Data Persistence + Taking our classic ViewModel, we are going to decide what is important to save upon application death/resume. We specifically do not save the state of commands because they are recreated by the constructor. It's debatable if you were to keep the Search Results, maybe that's a concern of your Akavache implementation. But DEFINITELY you want to save the SearchQuery, as when that is rehydrated it should restore the viewmodel to the exact state it was in. ```cs diff --git a/reactiveui/docs/handbook/default-exception-handler.md b/reactiveui/docs/handbook/default-exception-handler.md index 9ac574aff..b17ceeeb6 100644 --- a/reactiveui/docs/handbook/default-exception-handler.md +++ b/reactiveui/docs/handbook/default-exception-handler.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Default Exception Handler + The default behaviour of ReactiveUI is to crash the application with whenever an object that has a ThrownExceptions property doesn't have a subscription. You can override this behaviour or hook your debugger or analytics client by connecting an observable to [RxApp.DefaultExceptionHandler](~/api/ReactiveUI.RxApp.yml#ReactiveUI_RxApp_DefaultExceptionHandler): diff --git a/reactiveui/docs/handbook/dependency-inversion/custom-dependency-inversion.md b/reactiveui/docs/handbook/dependency-inversion/custom-dependency-inversion.md index 653cbad65..c05450e02 100644 --- a/reactiveui/docs/handbook/dependency-inversion/custom-dependency-inversion.md +++ b/reactiveui/docs/handbook/dependency-inversion/custom-dependency-inversion.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Custom Dependency Inversion Container + ## Override Default Depenedency Inversion Container We understand that some developers would prefer to use their favorite dependency inversion container. ReactiveUI allows for this by implementing `IMutableDependencyResolver`. Once this class has been implemented you simply need to assign it to `Locator` via `Locator.SetLocator()`. diff --git a/reactiveui/docs/handbook/dependency-inversion/index.md b/reactiveui/docs/handbook/dependency-inversion/index.md index 5a44e9e4b..a7dbac974 100644 --- a/reactiveui/docs/handbook/dependency-inversion/index.md +++ b/reactiveui/docs/handbook/dependency-inversion/index.md @@ -1,7 +1,4 @@ ---- -NoTitle: true ---- -## Dependency Injection +# Dependency Injection Dependency resolution is very useful for moving logic that would normally have to be in platform-specific code, into the shared platform code. First, we need to define an Interface for something that we want to use - this example isn't a Best Practice, but it's illustrative. diff --git a/reactiveui/docs/handbook/design-time.md b/reactiveui/docs/handbook/design-time.md index 63bdc9250..c5f311626 100644 --- a/reactiveui/docs/handbook/design-time.md +++ b/reactiveui/docs/handbook/design-time.md @@ -1,7 +1,4 @@ ---- -NoTitle: true ---- -## ReactiveUI Bindings +# ReactiveUI Bindings ReactiveUI offers a better design-time data system for solutions that use [ReactiveUI type-safe bindings](~/docs/handbook/data-binding/index.md). `this.Bind` methods family overwrite whatever has been put into XAML. If your XAML markup looks like this: diff --git a/reactiveui/docs/handbook/events.md b/reactiveui/docs/handbook/events.md index 7bbfeaf2a..86d1498f2 100644 --- a/reactiveui/docs/handbook/events.md +++ b/reactiveui/docs/handbook/events.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Events + Install the `ReactiveMarbles.ObservableEvents.SourceGenerator` package into your application. See installation guide for more info. You can use this events package standalone, without any reference to ReactiveUI. `ReactiveMarbles.ObservableEvents.SourceGenerator` will always be a separate package that has no dependancy on the `ReactiveUI` package. This package uses SourceGenerator to generate the observables for events within the platform. `ReactiveMarbles.ObservableEvents.SourceGenerator` has now replaced the `ReactiveUI.Events.*` packages. Don't use `EventHandlers` ever, use the generated `Observable.FromEventPattern` versions. Combine multiple `Observable.FromEventPattern`together to get amazing composition. Remember to [dispose of your subscriptions](~/docs/reactive-programming/index.md#lifecycle) using the features provided by the Reactive Extensions. diff --git a/reactiveui/docs/handbook/interactions/binding-interactions.md b/reactiveui/docs/handbook/interactions/binding-interactions.md index e52e470a0..2a83c4264 100644 --- a/reactiveui/docs/handbook/interactions/binding-interactions.md +++ b/reactiveui/docs/handbook/interactions/binding-interactions.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Binding Interactions + In addition to registering `Interaction` handlers manually, we also provide a set of view extension methods for setting up bindings, both of which mimic the `handler` parameter of the `RegisterHandler` overloads: ```cs diff --git a/reactiveui/docs/handbook/interactions/index.md b/reactiveui/docs/handbook/interactions/index.md index 5e95bbfda..9fa1debef 100644 --- a/reactiveui/docs/handbook/interactions/index.md +++ b/reactiveui/docs/handbook/interactions/index.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Interactions + Sometimes view model code needs to request a confirmation from the user. For example, before deleting a file or after an error occurs. Displaying an interactive dialog from the view model is an easy solution, but it ties the view model to a particular UI framework and makes the application harder or impossible to test. diff --git a/reactiveui/docs/handbook/logging/index.md b/reactiveui/docs/handbook/logging/index.md index ed0a879c6..721bba134 100644 --- a/reactiveui/docs/handbook/logging/index.md +++ b/reactiveui/docs/handbook/logging/index.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Logging in ReactiveUI + > One thing that motivates me to write my own instead of using the legion of others, is that most loggers give zero thought to perf concerns on mobile devices - they're all written for servers, so none of them think about CPU perf or allocations. The best imho is Serilog, but it allocates way too much stuff imho to be usable on mobile — Anaïs Betts (2014) [issue 46#issuecomment-56550457](https://github.com/reactiveui/splat/issues/46#issuecomment-56550457) ## Logging diff --git a/reactiveui/docs/handbook/message-bus.md b/reactiveui/docs/handbook/message-bus.md index 53d35f19e..d427789b0 100644 --- a/reactiveui/docs/handbook/message-bus.md +++ b/reactiveui/docs/handbook/message-bus.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Message Bus + Like many other MVVM frameworks, ReactiveUI includes an implementation of the message bus pattern. This allows you to send and recieve messages between different parts of the code without them directly accessing each other. diff --git a/reactiveui/docs/handbook/observable-as-property-helper.md b/reactiveui/docs/handbook/observable-as-property-helper.md index 42566de3f..bce5650d6 100644 --- a/reactiveui/docs/handbook/observable-as-property-helper.md +++ b/reactiveui/docs/handbook/observable-as-property-helper.md @@ -1,124 +1,85 @@ ---- -NoTitle: true ---- -The ObservableAsPropertyHelper (OAPH) is a class that simplifies the interop between an IObservable and a property on your ViewModel. It allows you to have a property which reflects the latest value that has been sent through the IObservable stream. +# ObservableAsPropertyHelper (OAPH) -It is important to note that OAPH will not set the property value immediately, but will rather schedule it on the provided or default scheduler. The `[Reactive]` property with `.BindTo()` should be used for business-critical code. - -It will invoke the `INotifyPropertyChanged` and `INotifyPropertyChanging` based events for the View Model when the observable emits a new value. `ObservableAsPropertyHelper` is very similar to a Lazy in so far as it provides a Value member which provides the latest value of the Observable. They are often read-only and reflect the IObservable stream. It is common to combine ObservableAsPropertyHelper with the `WhenAny` extensions. +The ObservableAsPropertyHelper (OAPH) bridges IObservable streams and read-only ViewModel properties. It exposes the latest value via a property and raises `INotifyPropertyChanging/Changed` notifications for you. -## Example +Key points: +- OAPH subscribes to the source observable and surfaces the latest value through `Value`. +- Delivery of notifications uses the scheduler you pass to `ToProperty` (defaults to `CurrentThreadScheduler`), so UI updates can be marshaled to `RxApp.MainThreadScheduler` when needed. +- You can supply an initial value and optionally defer subscription until the property is first read. +- Ideal for computed/read-only properties; use `RaiseAndSetIfChanged` for mutable properties. -First, we need to declare an Output Property, using a class called -`ObservableAsPropertyHelper`: +## Basic Example +```csharp +readonly ObservableAsPropertyHelper _firstName; +public string FirstName => _firstName.Value; -```cs -readonly ObservableAsPropertyHelper firstName; -public string FirstName => firstName.Value; -``` - -Similar to read-write properties, this code should always be 100% boilerplate. -Next, we'll use a helper method `ToProperty` to initialize `firstName` in the -constructor. `ToProperty` has two overloads, one where it directly returns the OAPH -and another where the OAPH is returned in a `out` parameter. We generally recommend -using the former approach due to better readability of the code: - -```cs -firstName = this - .WhenAnyValue(x => x.Name) - .Select(name => name.Split(' ')[0]) - .ToProperty(this, x => x.FirstName); -``` - -Here, `ToProperty` creates an `ObservableAsPropertyHelper` instance which will -signal that the `FirstName` property has changed. If you prefer using the overload -where the OAPH is returned in a `out` parameter, then use the following code: - -```cs -this.WhenAnyValue(x => x.Name) - .Select(name => name.Split(' ')[0]) - .ToProperty(this, x => x.FirstName, out firstName); +public MyViewModel() +{ + _firstName = this + .WhenAnyValue(x => x.Name) + .Where(n => !string.IsNullOrWhiteSpace(n)) + .Select(n => n.Split(' ')[0]) + .ToProperty(this, x => x.FirstName, scheduler: RxApp.MainThreadScheduler); +} ``` -## ToProperty() - -`ToProperty` allows you to construct an `ObservableAsPropertyHelper` from an `IObservable`. When a new value has been added to the `IObservable`, it will use the overload methods in the IReactiveObject interface to trigger the required events. - -`ToProperty` is an extension method on `IObservable` and semantically acts like a "Subscribe". - - ```cs +## ToProperty Overloads +`ToProperty` constructs an `ObservableAsPropertyHelper` from an `IObservable` and raises change notifications: +```csharp public static ObservableAsPropertyHelper ToProperty( - this IObservable target, - TObj source, + this IObservable source, + TObj owner, Expression> property, - TRet initialValue = default(TRet), + TRet initialValue = default, bool deferSubscription = false, IScheduler? scheduler = null) ``` - -The parameters of `ToProperty` allows you to specify the source of the property, often just the current class. -* An expression or a string to the Property that is exposed. -* Optionally the initial value being exposed by the Property before any values are emitted by the source observable. If you are deferring the subscription this value may be the first value since the observable won't be immediately subscribed to. -* Optionally if you defer subscription that will not subscribe to the observable until the user accesses the Property. By default we will subscribe to the observable immediately so that you have the latest value. -* Optionally a scheduler, by default this will be CurrentThreadScheduler from where the call is made. - -## Property vs ObservableAsPropertyHelper - -You should use a property and `RaiseAndSetIfChanged` if you are intending to mutate the value. - -`ObservableAsPropertyHelper` properties are useful for when you have "calculated" values, for example, if their value is solely the result of other properties. You will also use the `ObservableAsPropertyHelper` when you want to expose the latest value from a `IObservable`. - -`ObservableAsPropertyHelper` properties are helpful to remove spaghetti code where different methods and components may be mutating multiple locations. They also clearly define what values are used in the calculation of the value and help describe the dependent properties for the `ObservableAsPropertyHelper`, unlike settable properties where you have to search the code base further for location where the value is mutating. - -## Performance considerations - -## nameof() instead of using default Index. -For performance based solutions you can also use the `nameof()` operator override of `ToProperty()` -which won't use the Expression. - -```cs -firstName = this +- `initialValue`: Used before the first tick (or when deferring, until subscribed). +- `deferSubscription`: Subscribe on first property access (lazy). +- `scheduler`: Use `RxApp.MainThreadScheduler` for UI properties. + +## nameof Optimization +Avoid expression compilation by using the `nameof` overload: +```csharp +_firstName = this .WhenAnyValue(x => x.Name) - .Select(name => name.Split(' ')[0]) + .Select(n => n.Split(' ')[0]) .ToProperty(this, nameof(FirstName)); ``` -## Defer Subscription -If you are creating a large number of OAPH, consider deferring your subscription. `ToProperty` also allows you to deferSubscription to the underlying `IObservable`. Deferring the subscription not have the OAPH Subscribe to the base `IObservable` until the Value property has been accessed. This is especially useful if you have more complex `IObservable` because this approach is very close to the approach that `Lazy` takes. - -```cs -// nameStatusObservable is IObservable -var nameStatusObservable = this - .WhenAnyValue(x => x.Name) - .Select(name => GetLatestStatus(name)); - -// name is ObservableAsPropertyHelper -name = nameStatusObservable - .ToProperty(this, nameof(Name), deferSubscription: true); +## Deferred Subscription +Delay work until the property is first read. Consider buffering the last value with `Replay(1)` if the source is hot. +```csharp +var status = GetStatus().Replay(1).RefCount(); +_status = status.ToProperty(this, nameof(Status), deferSubscription: true); +``` -// nameStatusObservable won't be subscribed until the -// Name property is accessed. -private readonly ObservableAsPropertyHelper name; -public string Name => name.Value; -``` +## Error Handling +OAPH does not swallow errors. Ensure errors are handled upstream (e.g., `Catch`/`LoggedCatch`) or the subscription will terminate. -One caveat of deferring the subscription is if you aren't careful you'll have an invalid value until a new value is added to the `IObservable`. If using Hot Observables consider using a `ReplaySubject` and limiting the `ReplaySubject` to 1 previous value in the constructor. +## Using Source Generators +ReactiveUI.SourceGenerators can generate OAPH-backed properties with `[ObservableAsProperty]`: +```csharp +using ReactiveUI.SourceGenerators; -```cs -public class StatusViewModel : ReactiveObject +public partial class StatusViewModel : ReactiveObject { - readonly ObservableAsPropertyHelper status; - public string Status => status.Value; - + [ObservableAsProperty] + private string _status; + public StatusViewModel() { - var replayStatus = new ReplaySubject(1); - // .OnNext() the 'replayStatus' subject somewhere... - - // Note, that 'replayStatus' is also IObservable, - // so we are allowed to add a call to .ToProperty() to - // convert it to ObservableAsPropertyHelper. - status = replayStatus.ToProperty(this, nameof(Status), deferSubscription: true); + _statusHelper = StatusObservable().ToProperty(this, x => x.Status); } + + IObservable StatusObservable() => Observable.Return("Ready"); } ``` + +## When To Use OAPH vs Property +- Use OAPH for computed/read-only values that derive from other observables or properties. +- Use `RaiseAndSetIfChanged` for writable state your ViewModel mutates directly. + +## Advanced Notes +- OAPH behaves like a lazy/behavioral observable: it holds the last value and pushes changes on the configured scheduler. +- Combine with `WhenAnyValue`, `Select`, `Throttle`, `DistinctUntilChanged` for efficient UI updates. diff --git a/reactiveui/docs/handbook/routing.md b/reactiveui/docs/handbook/routing.md index d157e4f66..41a54320a 100644 --- a/reactiveui/docs/handbook/routing.md +++ b/reactiveui/docs/handbook/routing.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Routing + Routing enables an application to coordinate navigation through multiple views and their corresponding view models, and to keep track of the user's navigation state. ReactiveUI supports routing for the following platforms: diff --git a/reactiveui/docs/handbook/scheduling.md b/reactiveui/docs/handbook/scheduling.md index feea775eb..64d00ba71 100644 --- a/reactiveui/docs/handbook/scheduling.md +++ b/reactiveui/docs/handbook/scheduling.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Scheduling in ReactiveUI + Scheduling is a core part of writing any app that uses the Reactive Extensions, as all operations are deferred (i.e. run on other threads or on the UI thread). Schedulers allow apps to control what context code runs in, and it is important that libraries that run code on other threads are scheduler-aware. ReactiveUI provides two app-wide schedulers that should be used in-place of other schedulers such as the built-in Rx schedulers: * **RxApp.MainThreadScheduler** - This scheduler executes on the UI thread. On XAML-based platforms, this is equivalent to Dispatcher.BeginInvoke. diff --git a/reactiveui/docs/handbook/snippets.md b/reactiveui/docs/handbook/snippets.md index fa9986f54..4e92c1bd8 100644 --- a/reactiveui/docs/handbook/snippets.md +++ b/reactiveui/docs/handbook/snippets.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Snippets + Snippets are short code templates that can be inserted into your code. They are used to reduce the amount of typing when writing repetitive code. The snippets are activated by writing the shortcut of the snippet and hitting **Tab** (**Tab, Tab** in Visual Studio). The **snippets** folder in the [ReactiveUI repository](https://github.com/reactiveui/reactiveui/) on Github contains snippets for inserting common code when using ReactiveUI. There are snippets available for Visual Studio, Visual Studio for Mac, Visual Studio Code, JetBrains Resharper and JetBrains Rider. diff --git a/reactiveui/docs/handbook/testing.md b/reactiveui/docs/handbook/testing.md index 8ea41b06b..543c0bdec 100644 --- a/reactiveui/docs/handbook/testing.md +++ b/reactiveui/docs/handbook/testing.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Testing + ReactiveUI includes a few tools to help testing, built on what Reactive Extensions for .NET already include. The utilities are included in the `ReactiveUI.Testing` NuGet package. Make sure to install it into your unit tests project. ## Custom Scheduler diff --git a/reactiveui/docs/handbook/user-input-validation.md b/reactiveui/docs/handbook/user-input-validation.md index 1b5952c3f..60bb42fbe 100644 --- a/reactiveui/docs/handbook/user-input-validation.md +++ b/reactiveui/docs/handbook/user-input-validation.md @@ -1,6 +1,7 @@ ---- -NoTitle: true ---- +# User Input Validation + +When building applications, you often need to validate user input. This is especially true for mobile applications, where users expect immediate feedback on their actions. In this guide, we will explore how to implement user input validation in ReactiveUI applications using built-in features and the ReactiveUI.Validation package. + ReactiveUI itself offers a few powerful features allowing you to validate user input on fly. With [WhenAnyValue](~/docs/handbook/when-any.md), you can listen to view model property changes and control [ReactiveCommand](~/docs/handbook/commands/index.md) executability. When reactive command's `CanExecute` observable returns false, the control to which you bind that command stays disabled. The simplest validator looks as follows: ```cs diff --git a/reactiveui/docs/handbook/view-location/extending-iviewfor.md b/reactiveui/docs/handbook/view-location/extending-iviewfor.md index 69c404b5b..3bd959261 100644 --- a/reactiveui/docs/handbook/view-location/extending-iviewfor.md +++ b/reactiveui/docs/handbook/view-location/extending-iviewfor.md @@ -1,9 +1,4 @@ ---- -NoTitle: true -Title: Extending View Support ---- - -## Extending IViewFor +# Extending IViewFor There will be times where you need to extend the power of ReactiveUI view types to concrete implementations you don't control. The answer then is in extending the `IViewFor` interface so that ReactiveUI will pick up and register it against the `ViewLocator` instance. Once you implement `IViewFor`, binding methods are now available as extension methods on your class. diff --git a/reactiveui/docs/handbook/view-location/index.md b/reactiveui/docs/handbook/view-location/index.md index 7fc8aabb4..82ce0a62d 100644 --- a/reactiveui/docs/handbook/view-location/index.md +++ b/reactiveui/docs/handbook/view-location/index.md @@ -1,7 +1,4 @@ ---- -NoTitle: true ---- -## IViewFor, Activation and Data Binding +# IViewFor, Activation and Data Binding In order to use bindings in the View, you must first implement `IViewFor` on your View. Once you [implement `IViewFor`](extending-iviewfor.md), binding methods are now available as extension methods on your class, as well as [activation and deactivation](~/docs/handbook/when-activated.md) feature for your views and associated view models that implement the `IActivatableViewModel` interface. See [Data Binding](~/docs/handbook/data-binding/index.md) section for details and platform-specific examples. diff --git a/reactiveui/docs/handbook/view-models/boilerplate-code.md b/reactiveui/docs/handbook/view-models/boilerplate-code.md index 51fcc6f84..f2eeef8cd 100644 --- a/reactiveui/docs/handbook/view-models/boilerplate-code.md +++ b/reactiveui/docs/handbook/view-models/boilerplate-code.md @@ -1,6 +1,3 @@ ---- -NoTitle: true ---- # Source Generators and Fody, the easy way to create properties in ReactiveUI If you are tired of writing boilerplate code for property change notifications, you can try one of the following: diff --git a/reactiveui/docs/handbook/view-models/index.md b/reactiveui/docs/handbook/view-models/index.md index cb883dcbd..134f9ea28 100644 --- a/reactiveui/docs/handbook/view-models/index.md +++ b/reactiveui/docs/handbook/view-models/index.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# ViewModels + At the core of every MVVM framework is the *ViewModel* - while this class is the most interesting aspect of the MVVM pattern, it is also the most misunderstood. Properly reasoning about what a ViewModel is and is not, is crucial to correctly applying the MVVM pattern. ## The Zen of The ViewModel diff --git a/reactiveui/docs/handbook/when-activated.md b/reactiveui/docs/handbook/when-activated.md index bfb5b909a..5edc15d8c 100644 --- a/reactiveui/docs/handbook/when-activated.md +++ b/reactiveui/docs/handbook/when-activated.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# WhenActivated + ## ViewModels WhenActivated is a way to track disposables. Besides that, it can be used to defer the setup of a ViewModel until it's truly required. WhenActivated also gives us an ability to start or stop reacting to hot observables, like a background task that periodically pings a network endpoint or an observable updating users current location. Moreover, one can use WhenActivated to trigger startup logic when the ViewModel comes on stage. See an example: diff --git a/reactiveui/docs/handbook/when-any.md b/reactiveui/docs/handbook/when-any.md index ec3ddbe25..c36c9706a 100644 --- a/reactiveui/docs/handbook/when-any.md +++ b/reactiveui/docs/handbook/when-any.md @@ -1,6 +1,7 @@ ---- -NoTitle: true ---- +# WhenAny + +[![YouTube](https://img.shields.io/badge/YouTube-ReactiveUI-red?logo=youtube)](https://www.youtube.com/watch?v=IH2yx7b9DNY) + In interactive UI applications, state is continually changing in response to user actions and application events. ReactiveUI enables you to express changes to application state as streams of values and combine and manipulate them using the powerful Reactive Extensions library. The motivation is intuitive enough when you think about it. It's not hard to imagine that changes to a property can be considered events - that's how `INotifyPropertyChanged` works. From there, the same argument for using Rx over events applies. In the context of MVVM application design specifically, modelling property changes as observables leads to several advantages: diff --git a/reactiveui/docs/index.md b/reactiveui/docs/index.md index 2a0391c5c..df846be73 100644 --- a/reactiveui/docs/index.md +++ b/reactiveui/docs/index.md @@ -1,6 +1,4 @@ ---- -Title: Documentation ---- +# Documentation

    ReactiveUI is a composable, cross-platform model-view-viewmodel framework for all .NET platforms, that is inspired by functional reactive programming. Reactive programming is a paradigm that allows you to express the idea around a feature in one readable place, abstract mutable state away from your user interfaces and improve the testability of your application.

    diff --git a/reactiveui/docs/reactive-programming/index.md b/reactiveui/docs/reactive-programming/index.md index d18ddea4d..0ea8ec69f 100644 --- a/reactiveui/docs/reactive-programming/index.md +++ b/reactiveui/docs/reactive-programming/index.md @@ -1,7 +1,7 @@ --- -NoTitle: true Order: 12 --- +# Reactive Programming > Rx Icon   [Reactive programming](https://reactivex.io) is programming with asynchronous data streams. diff --git a/reactiveui/docs/reactive-programming/videos.md b/reactiveui/docs/reactive-programming/videos.md index 753d6aa3f..7c168e2f4 100644 --- a/reactiveui/docs/reactive-programming/videos.md +++ b/reactiveui/docs/reactive-programming/videos.md @@ -1,7 +1,4 @@ ---- -NoTitle: true ---- -## Reactive Programming: changing the world at Netflix, Microsoft, Slack and beyond! +# Reactive Programming: changing the world at Netflix, Microsoft, Slack and beyond! Matthew Podwysocki at AngularConf diff --git a/reactiveui/docs/resources/blogs.md b/reactiveui/docs/resources/blogs.md index 47a7bdc5c..56b02e441 100644 --- a/reactiveui/docs/resources/blogs.md +++ b/reactiveui/docs/resources/blogs.md @@ -1,8 +1,9 @@ --- -NoTitle: true Order: 40 -Title: Blog Posts --- +# Blog Posts + +A collection of blog posts about ReactiveUI and related topics. ## 2017 diff --git a/reactiveui/docs/resources/in-the-news.md b/reactiveui/docs/resources/in-the-news.md index 42d20e6cc..a3f7b63c9 100644 --- a/reactiveui/docs/resources/in-the-news.md +++ b/reactiveui/docs/resources/in-the-news.md @@ -1,7 +1,7 @@ --- -NoTitle: true Order: 50 --- +# In the News ## 2017 diff --git a/reactiveui/docs/resources/podcasts.md b/reactiveui/docs/resources/podcasts.md index 0122ff8e8..4ee8f106d 100644 --- a/reactiveui/docs/resources/podcasts.md +++ b/reactiveui/docs/resources/podcasts.md @@ -1,7 +1,7 @@ --- -NoTitle: true Order: 30 --- +# Podcasts ## 2011 diff --git a/reactiveui/docs/resources/presentations.md b/reactiveui/docs/resources/presentations.md index 58a47bf97..95c694439 100644 --- a/reactiveui/docs/resources/presentations.md +++ b/reactiveui/docs/resources/presentations.md @@ -1,7 +1,7 @@ --- -NoTitle: true Order: 20 --- +# Presentations ## 2017 diff --git a/reactiveui/docs/resources/samples.md b/reactiveui/docs/resources/samples.md index 839e5784e..d24bbcc46 100644 --- a/reactiveui/docs/resources/samples.md +++ b/reactiveui/docs/resources/samples.md @@ -1,8 +1,7 @@ --- -NoTitle: true -Title: Samples Order: 15 --- +# Samples ## Samples Repository diff --git a/reactiveui/docs/resources/videos.md b/reactiveui/docs/resources/videos.md index 810a0a375..831d0683a 100644 --- a/reactiveui/docs/resources/videos.md +++ b/reactiveui/docs/resources/videos.md @@ -1,7 +1,9 @@ --- -NoTitle: true Order: 10 --- +# Videos +A collection of videos about ReactiveUI and related topics. + ## 2021 ## On .NET Live - Building Reactive UIs with Blazor diff --git a/reactiveui/docs/roadmap/index.md b/reactiveui/docs/roadmap/index.md index e39d8d321..30e94cf26 100644 --- a/reactiveui/docs/roadmap/index.md +++ b/reactiveui/docs/roadmap/index.md @@ -1,6 +1,4 @@ ---- -NoTitle: true -Title: Roadmap +# Roadmap --- Want to see something done sooner? Speak with one of the maintainers and ask how you can help as the easiest way to influence the direction or have a feature implemented earlier is to make significant, high-quality contributions and if you so desire, become a project maintainer. diff --git a/reactiveui/docs/security/index.md b/reactiveui/docs/security/index.md index 06f9fc10c..0abda7a38 100644 --- a/reactiveui/docs/security/index.md +++ b/reactiveui/docs/security/index.md @@ -1,7 +1,4 @@ ---- -NoTitle: true ---- -## Digital Signature Details +# Digital Signature Details ## Issuer ``` diff --git a/reactiveui/docs/upgrading/index.md b/reactiveui/docs/upgrading/index.md index fcaad5157..25d7ea55f 100644 --- a/reactiveui/docs/upgrading/index.md +++ b/reactiveui/docs/upgrading/index.md @@ -1,6 +1,5 @@ ---- -NoTitle: true ---- +# Upgrading ReactiveUI + ReactiveUI has been going through rapid changes since version 7. Here are some guides on how to upgrade to newer features.