Nuclex.Windows.Forms.Depend.../Source/MvvmExtensions.cs
2025-06-19 15:20:02 +02:00

92 lines
3.4 KiB
C#

#region Apache License 2.0
/*
Nuclex .NET Framework
Copyright (C) 2002-2024 Markus Ewald / Nuclex Development Labs
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#endregion // Apache License 2.0
using System;
#if NET6_0_OR_GREATER
using System.Runtime.Versioning;
#endif
using Microsoft.Extensions.DependencyInjection;
using Nuclex.Windows.Forms.AutoBinding;
using Nuclex.Windows.Forms.CommonDialogs;
using Nuclex.Windows.Forms.Messages;
namespace Nuclex.Windows.Forms.DependencyInjection {
/// <summary>Sets up the service bindings for an MVVM-based application</summary>
#if NET6_0_OR_GREATER
[SupportedOSPlatform("windows")]
#endif
public static class MvvmExtensions {
/// <summary>Registers all MVVM supporting services for a WinForms application</summary>
/// <param name="services">Service collection the services will be registered to</param>
/// <returns>The service collection for method chaining</returns>
public static IServiceCollection AddMvvm(this IServiceCollection services) {
// The window manager keeps track of which Window is in the foreground
// and handles opening modal or modeless windows for which it either
// binds provided view models or requests new instances.
services.AddSingleton<WindowManager, DependencyInjectedWindowManager>();
// The IWindowManager is the main interface that should be used to
// create new windows and dialogs
services.AddSingleton<IWindowManager>(
sp => sp.GetRequiredService<WindowManager>()
);
// The IActiveWindowTracker is a very simple interface to let Windows Forms
// extensions that need to display message boxes or other things query for
// the currently active top-level window.
services.AddSingleton<IActiveWindowTracker>(
sp => sp.GetRequiredService<WindowManager>()
);
// The auto binder uses convention-over-configuration to automatically
// establish data bindings or call view model methods that share their name
// with button controls.
services.AddSingleton<IAutoBinder, ConventionBinder>();
return services;
}
/// <summary>Registers all MVVM supporting services for a WinForms application</summary>
/// <param name="services">Service collection the services will be registered to</param>
/// <returns>The service collection for method chaining</returns>
public static IServiceCollection AddCommonDialogs(this IServiceCollection services) {
// Implementation of the message service that uses plain MessageBoxes
// from the Win32 API to display messages to the user
services.AddSingleton<IMessageService, StandardMessageBoxManager>();
// Common dialog adapter that uses the built-in common dialogs from
// basic WinForms to display file open, save or print dialogs
services.AddSingleton<ICommonDialogService, CommonDialogManager>();
return services;
}
}
} // namespace Nuclex.Windows.Forms.DependencyInjection