WPF CommunityToolkit.mvvm implement dependency injection via ServiceBuilder and ServiceCollection

Install-Package communitytoolkit.mvvm
Install-Package Microsoft.Extensions.DependencyInjection

 

<Application x:Class="WpfApp3.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp3"
             >
    <Application.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="FontSize" Value="80"/>
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="VerticalAlignment" Value="Center"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="FontSize" Value="150"/>
                    <Setter Property="Foreground" Value="Red"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Application.Resources>
</Application>






using System.Configuration;
using System.Data;
using System.Windows;
using CommunityToolkit.Mvvm;
using CommunityToolkit;
using System.Security.Cryptography;
using Microsoft.Extensions.DependencyInjection;

namespace WpfApp3
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public static IServiceProvider? ServiceProvider { get; private set; }
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            ConfigureServices();

            var win = ServiceProvider?.GetRequiredService<MainWindow>();
            win.Show();
        }       

        public void ConfigureServices()
        {
            ServiceCollection services = new ServiceCollection();
            services.AddSingleton<IIDService, IDService>();
            services.AddSingleton<INameService, NameService>();
            services.AddSingleton<MainWindow>();
            services.AddSingleton<MainWindowViewModel>();
            ServiceProvider=services.BuildServiceProvider();
        }
    }

    public interface IIDService
    {
        public int GetID();
    }

    public class IDService : IIDService
    {
        public static int id = 0;
        public int GetID()
        {
            return Interlocked.Increment(ref id);
        }
    }

    public interface INameService
    {
        public string GetName();
    }

    public class NameService : INameService
    {
        static int idx = 0;
        public string GetName()
        {
            return $"Name_{Interlocked.Increment(ref idx)}";
        }
    }
}


<Window x:Class="WpfApp3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp3"
        mc:Ignorable="d"
        WindowState="Maximized"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Button Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2"
                Content="Load" FontSize="150"
                Command="{Binding LoadCommand}"/>
        <TextBlock Text="{Binding Id}" Grid.Row="1" Grid.Column="0"/>
        <TextBlock Text="{Binding Name}" Grid.Row="1" Grid.Column="1"/>
    </Grid>
</Window>


using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using CommunityToolkit.Mvvm;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Microsoft.Extensions.DependencyInjection;

namespace WpfApp3
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        //MainWindowViewModel vm;
        public MainWindow(MainWindowViewModel vmValue)
        {
            InitializeComponent();
            this.DataContext=vmValue;
        }
    }

    public class MainWindowViewModel : ObservableObject
    {
        IIDService idService;
        INameService nameService;
        public MainWindowViewModel(IIDService idServiceValue, INameService nameServiceValue)
        {
            idService = idServiceValue;
            nameService = nameServiceValue;
            LoadCommand = new RelayCommand<object>(LoadCommandExecuted);
        }

        private void LoadCommandExecuted(object? obj)
        {
            Id = idService.GetID();
            Name = nameService.GetName();
        }

        public RelayCommand<object> LoadCommand { get; set; }

        private int id;
        public int Id
        {
            get
            {
                return id;
            }
            set
            {
                SetProperty(ref id, value);
            }
        }

        private string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                SetProperty(ref name, value);
            }
        }
    }
}

 

 

 

 

 

image

 

 

 

 

 

 

 

 

image

 

posted @ 2026-02-08 18:56  FredGrit  阅读(21)  评论(0)    收藏  举报