Megosztás a következőn keresztül:


MVVM-eszközkészlet funkciói

Tipp.

Ez a tartalom egy részlet az eBook, Enterprise Application Patterns Using .NET MAUI, elérhető a .NET Docs vagy egy ingyenesen letölthető PDF, hogy lehet olvasni offline.

Vállalati alkalmazásminták .NET-alapú MAUI eBook-borító miniatűr használatával.

MVVM-eszközkészlet

A Model-View-ViewModel (MVVM) minta nagyszerű szerkezeti alap az alkalmazások létrehozásához. Ebben a mintában a ViewModel lesz az alkalmazás gerince, mivel kommunikációt biztosít az előtérbeli felhasználói felület és a háttérösszetevők számára. A felhasználói felülettel való integráció érdekében a ViewModel tulajdonságaira és parancsaira támaszkodunk. A nézetfrissítés az alapul szolgáló nézetmodell vagy -modell változásaira válaszul című cikkben leírtak szerint a INotifyPropertyChanged Nézetmodell felületén található felület lehetővé teszi a tulajdonságok módosításainak értesítését az érték módosításakor. Ezeknek a funkcióknak a megvalósítása azt jelenti, hogy a ViewModel végül nagyon részletessé válhat. Az alábbi kód például egy egyszerű ViewModel-et jelenít meg, amelynek tulajdonságai módosításokat váltanak ki:

public class SampleViewModel : INotifyPropertyChanged
{
    private string _name;
    private int _value;

    public event PropertyChangedEventHandler PropertyChanged;

    public string Name
    {
        get => _name;
        set => SetPropertyValue(ref _name, value);
    }

    public int Value
    {
        get => _value;
        set => SetPropertyValue(ref _value, value);
    }

    protected void SetPropertyValue<T>(ref T storageField, T newValue, [CallerMemberName] string propertyName = "")
    {
        if (Equals(storageField, newValue))
            return;

        storageField = newValue;
        RaisePropertyChanged(propertyName);
    }

    protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Bár bizonyos optimalizálásokat idővel el lehet végezni, továbbra is meglehetősen részletes kódkészlettel fogjuk végezni a ViewModel definiálását. Ezt a kódot nehéz lehet karbantartani, és hibalehetőséget okoz.

A CommunityToolkit.Mvvm NuGet-csomag (más néven MVVM-eszközkészlet) segítségével kezelheti és egyszerűsítheti ezeket a gyakori MVVM-mintákat. Az MVVM Eszközkészlet a .NET nyelv újabb funkcióival együtt lehetővé teszi az egyszerűsített logikát, a projektbe való könnyű bevezetést és a futtatókörnyezet függetlenségét. Az alábbi példa ugyanazt a Nézetmodellt mutatja be, amely az MVVM-eszközkészlethez tartozó összetevőket használja:

public partial class SampleViewModel : ObservableObject
{
    [ObservableProperty]
    private string _name;

    [ObservableProperty]
    private int _value;
}

Feljegyzés

Az MVVM-eszközkészletet a CommunityToolkit.Mvvm csomag biztosítja. A csomag projekthez való hozzáadásáról további információt a Microsoft Fejlesztői központ MVVM-eszközkészletének bemutatása című témakörben talál.

Az eredeti példához képest drasztikusan csökkenthettük az általános összetettséget, és leegyszerűsítettük a ViewModel karbantarthatóságát. Az MVVM-eszközkészlet számos előre elkészített általános összetevővel és funkcióval rendelkezik, például a ObservableObject fent bemutatottak, amelyek leegyszerűsítik és egységesítik az alkalmazás teljes kódját.

ObservableObject

Az MVVM-eszközkészlet biztosítja ObservableObject , amely az objektumok alapjául ViewModel szolgál, vagy bármely olyan objektumot, amelynek változásértesítéseket kell küldenie. Implementálja INotifyPropertyChanged és INotifyPropertyChanging segíti a tulajdonságok beállítását és a változások növelését. Az alábbiakban egy példa látható egy szabványos Nézetmodellre a következő használatával ObservableObject:

public class SampleViewModel : ObservableObject
{
    private string _name;
    private int _value;

    public string Name
    {
        get => _name;
        set => SetProperty(ref _name, value);
    }

    public int Value
    {
        get => _value;
        set => SetProperty(ref _value, value);
    }
}

ObservableObject kezeli a változásértesítések beállításához szükséges összes logikát a SetProperty tulajdonságválasztó metódusával. Ha olyan tulajdonsága van, amely egy tulajdonságot Task<T>ad vissza, a SetPropertyAndNotifyOnCompletion metódussal késleltetheti a tulajdonságváltozás közzétételét a tevékenység befejezéséig. A metódusok OnPropertyChanged és OnPropertyChanging az objektumban szükség esetén a tulajdonságváltozások emelésére is használhatók.

További információ: ObservableObjectObservableObject az MVVM Eszközkészlet fejlesztői központban.

RelayCommand és AsyncRelayCommand

A .NET-vezérlők MAUI (például egy gombra koppintás vagy egy gyűjteményből származó elem kijelölése) és a ViewModel közötti interakció a ICommand felülettel történik. A .NET MAUI az objektum alapértelmezett implementációjával ICommandCommand rendelkezik. A .NET MAUImeglehetősen alapszintű, és nem támogatja Command a speciálisabb funkciókat, például az aszinkron munka és a parancsvégrehajtás állapotát.

Az MVVM eszközkészlet két parancsot tartalmaz, RelayCommand és AsyncRelayCommand. RelayCommand Olyan helyzetekre szolgál, amikor szinkron kódot kell végrehajtania, és a .NET-objektumhoz MAUICommand hasonló implementációval rendelkezik.

Feljegyzés

Annak ellenére, hogy a .NET MAUIés hasonló, a használata Command lehetővé teszi a ViewModel függetlenítését a közvetlen .NET-hivatkozásoktólRelayCommand.RelayCommandMAUI Ez azt jelenti, hogy a ViewModel hordozhatóbb, így könnyebben újrafelhasználható a projektek között.

AsyncRelayCommand számos további funkciót biztosít az aszinkron munkafolyamatok használatakor. Ez meglehetősen gyakori a ViewModelben, mivel általában adattárakkal, API-kkal, adatbázisokkal és más, azokat használó async/awaitrendszerekkel kommunikálunk. A AsyncRelayCommand konstruktor végrehajt egy végrehajtási feladatot, amely a Func<Task> konstruktor részeként visszatérő Task meghatalmazottként vagy meghatalmazottként van definiálva. Amíg a végrehajtási feladat fut, figyelni fogja a tevékenység állapotát, AsyncRelayCommand és frissítéseket biztosít a IsRunning tulajdonság használatával. A IsRunning tulajdonság a felhasználói felülethez köthető, amely segít kezelni a vezérlőállapotokat, például betöltést jelenít meg egy ActivityIndicator vezérlővel, vagy letiltja/engedélyezi a vezérlőt. A végrehajtási feladat végrehajtása közben a Cancel metódus meghívható a végrehajtási tevékenység visszavonásának megkísérlésére, ha támogatott.

Alapértelmezés szerint AsyncRelayCommand nem engedélyezi az egyidejű végrehajtást. Ez nagyon hasznos azokban az esetekben, amikor a felhasználó véletlenül többször is koppinthat egy vezérlőre egy hosszú ideig futó vagy költséges művelet végrehajtásához. A feladat végrehajtása AsyncRelayCommand során a rendszer automatikusan meghívja az eseményt CanExecuteChanged . A .NET-ben MAUIazok a vezérlők, amelyek támogatják az Command eseményt és CommandParameter a tulajdonságokat, például Button, figyelik az eseményt, és automatikusan engedélyezik vagy letiltják azt a végrehajtás során. Ezt a funkciót felül lehet bírálni egy egyéni canExecute paraméterrel, vagy beállíthatja a AsyncRelayCommandOptions.AllowConcurrentExecutions jelölőt a konstruktorban.

A parancsok implementálásával kapcsolatos részletesebb információkért tekintse meg az MVVM fejezet parancsainak implementálása című szakaszát. Részletes információk az RelayCommand MVVM Eszközkészlet fejlesztői központ parancsolatábanAsyncRelayCommand.

Forrásgenerátorok

Az MVVM Toolkit-összetevők beépített használatával jelentősen leegyszerűsítheti a ViewModel-et. Az MVVM-eszközkészlet lehetővé teszi, hogy még tovább egyszerűsítse a gyakori kódhasználati eseteket a Forrásgenerátorok használatával. Az MVVM-eszközkészlet forrásgenerátorai konkrét attribútumokat keresnek a kódban, és burkolókat hozhatnak létre tulajdonságokhoz és parancsokhoz.

Fontos

Az MVVM-eszközkészlet forrásgenerátorai olyan kódot hoznak létre, amely a meglévő objektumokhoz ad adalékot. Emiatt a forrásgenerátort használó objektumokat meg kell jelölni partial.

Az MVVM Eszközkészlet ObservableProperty attribútum alkalmazható olyan objektumok mezőire, amelyektől ObservableObject öröklődnek, és egy olyan tulajdonsággal burkolják körbe a magánmezőket, amelyek módosításokat generálnak. Az alábbi kód egy példát mutat be a ObservableObject mező attribútumának _name használatára:

public partial class SampleViewModel : ObservableObject
{
    [ObservableProperty]
    private string _name;
}

ObservableProperty A mezőre _name alkalmazott attribútummal a forrásgenerátor fut, és létrehoz egy másik részleges osztályt a következő kóddal:

partial class SampleViewModel
{
    public string Name
    {
        get => _name;
        set
        {
            if (!EqualityComparer<string>.Default.Equals(_name, value))
            {
                OnNameChanging(value);
                OnPropertyChanging("Name");
                _name = value;
                OnNameChanged(value);
                OnPropertyChanged("Name");
            }
        }
    }
}

A generált SampleViewModel a privát _name mezőt használta, és létrehozott egy új Name tulajdonságot, amely megvalósítja a változásértesítések létrehozásához szükséges összes logikát.

Az MVVM Toolkit RelayCommand attribútum alkalmazható az adott ObservableObject metódusokra, és létrehoz egy megfelelő RelayCommand vagy AsyncRelayCommand. Az alábbi kód példákat mutat be az RelayCommand attribútum használatára:

public partial class SampleViewModel : ObservableObject
{
    public INavigationService NavigationService { get; set; }

    [ObservableProperty]
    private string _name;

    [ObservableProperty]
    bool _isValid;

    [RelayCommand]
    private Task SettingsAsync()
    {
        return NavigationService.NavigateToAsync("Settings");
    }

    [RelayCommand]
    private void Validate()
    {
        IsValid = !string.IsNullOrEmpty(Name);
    }
}

A RelayCommand metódusra Validate alkalmazott metódus érvényesítési RelayCommand értéket hoz létreValidateCommand, mert visszaadjavoid, és a SettingsAsync metódus létrehoz egy AsyncRelayCommand elnevezettetSettingsCommand. A forrásgenerátor a következő kódot hozza létre más részleges osztályokban:

partial class SampleViewModel
{
    private AsyncRelayCommand? settingsCommand;

    SettingsCommand => settingsCommand ??= new AsyncRelayCommand(SettingsAsync);
}

partial class SampleViewModel
{
    private RelayCommand? validateCommand;

    public IRelayCommand ValidateCommand => validateCommand ??= new RelayCommand(Validate);
}

A ViewModel metódusainak implementációval való ICommand burkolásának összetettségét a forrásgenerátor kezelte.

Az MVVM eszközkészlet-forrásgenerátorokkal kapcsolatos további információkért lásd az MVVM eszközkészlet fejlesztői központjában található MVVM-forrásgenerátorokat .

Összegzés

Az MVVM-eszközkészlet nagyszerű módszer a ViewModel-kód szabványosítására és egyszerűsítésére. Az MVVM eszközkészlet a standard MVVM-összetevők, például ObservableObject és Async/RelayCommand. A forrásgenerátorok segítenek leegyszerűsíteni a ViewModel-tulajdonságokat és -parancsokat a felhasználói felületi interakciókhoz szükséges összes sablonkód generálásával. Az MVVM Eszközkészlet az ebben a fejezetben bemutatottakon kívül még több funkciót kínál. Az MVVM-eszközkészletről további információt az MVVM Eszközkészlet bemutatása az MVVM Eszközkészlet fejlesztői központban című témakörben talál.