
.NET Community Toolkit - это коллекция классов-хелперов и API, которые могут использовать все .NET - разработчики и которые не зависят от конкретной платформы пользовательского интерфейса.
Toolkit поддерживается и публикуется Microsoft и является частью .NET Foundation.
.NET Community Toolkit - это наследник Windows Community Toolkit. Его появление разработчики объясняют следующим образом: со временем росло число библиотек API, использующих .NET и при этом не рассчитанных на работу с Windows. Поэтому было принято решение выделить отдельный проект, чтобы иметь возможность развиваться независимо и быть доступным для .NET-разработчиков не для Windows.
Так как последняя версия Windows Community Toolkit перед выделением нового проекта была 7.1.x, то было решено первый релиз .NET Community Toolkit обозначить как 8.0.0. В дальнейшем оба проекта будут развиваться и версионироваться независимо.
Библиотеки, входящие в .NET Community Toolkit:
CommunityToolkit.Common
CommunityToolkit.Mvvm
(aka “Microsoft MVVM Toolkit”)CommunityToolkit.Diagnostics
CommunityToolkit.HighPerformance
Одним из самых важных компонентов Toolkit'a является MVVM Toolkit. В его основе лежит MVVMLight, ранее крайне популярная библиотека для разработки приложений с использованием паттерна MVVM (в настоящий момент не поддерживается). Для тех, кто до сих пор использует MVVMLight, есть план перехода на Microsoft MVVM Toolkit.
В двух словах о новых возможностях в версии 8.0.0 в плане именно MVVM Toolkit'a.
Заявлено интенсивное использований генераторов кода (source generators), что позволит сократить количество boilerplate-кода.
при объявлении и реализации Commands:
было:
private IRelayCommand<User> greetUserCommand;
public IRelayCommand<User> GreetUserCommand => greetUserCommand ??= new RelayCommand<User>(GreetUser);
private void GreetUser(User user)
{
Console.WriteLine($"Hello {user.Name}!");
}
стало:
[RelayCommand]
private void GreetUser(User user)
{
Console.WriteLine($"Hello {user.Name}!");
}
при объявлении и реализации Observable properties:
было:
private string? firstName;
public string? FirstName
{
get => firstName;
set
{
if (SetProperty(ref firstName, value))
{
OnPropertyChanged(nameof(FullName));
GreetUserCommand.NotifyCanExecuteChanged();
}
}
}
private string? lastName;
public string? LastName
{
get => lastName;
set
{
if (SetProperty(ref lastName, value))
{
OnPropertyChanged(nameof(FullName));
GreetUserCommand.NotifyCanExecuteChanged();
}
}
}
public string? FullName => $"{FirstName} {LastName}";
стало:
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(FullName))]
[NotifyCanExecuteChangedFor(nameof(GreetUserCommand))]
private string? firstName;
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(FullName))]
[NotifyCanExecuteChangedFor(nameof(GreetUserCommand))]
private string? lastName;
public string? FullName => $"{FirstName} {LastName}";
Также при использовании атрибута [ObservableProperty] MVVM Toolkit сгенерирует два метода: On<PROPERTY_NAME>Changing и On<PROPERTY_NAME>Changed
Таким образом, конструкция вида
[ObservableProperty]
private string name;
partial void OnNameChanging(string name)
{
Console.WriteLine($"The name is about to change to {name}!");
}
partial void OnNameChanged(string name)
{
Console.WriteLine($"The name just changed to {name}!");
}
развернётся в
public string Name
{
get => name;
set
{
if (!EqualityComparer<string>.Default.Equals(name, value))
{
OnNameChanging(value);
OnPropertyChanging();
name = value;
OnNameChanged();
OnPropertyChanged();
}
}
}
partial void OnNameChanging(string name);
partial void OnNameChanged(string name);