<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=.NET_MAUI%3A_Ladeanzeige_mit_ActivityIndicator</id>
	<title>.NET MAUI: Ladeanzeige mit ActivityIndicator - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=.NET_MAUI%3A_Ladeanzeige_mit_ActivityIndicator"/>
	<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=.NET_MAUI:_Ladeanzeige_mit_ActivityIndicator&amp;action=history"/>
	<updated>2026-10-17T09:29:53Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in maxTechCorner</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://techcorner.max-it.de/index.php?title=.NET_MAUI:_Ladeanzeige_mit_ActivityIndicator&amp;diff=4305&amp;oldid=prev</id>
		<title>imported&gt;TechCorner-Redaktion: Neufassung von &quot;Xamarin: Wartedialog Daten laden&quot;: ActivityIndicator, CommunityToolkit.Mvvm, RefreshView</title>
		<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=.NET_MAUI:_Ladeanzeige_mit_ActivityIndicator&amp;diff=4305&amp;oldid=prev"/>
		<updated>2026-10-14T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;Neufassung von &amp;quot;Xamarin: Wartedialog Daten laden&amp;quot;: ActivityIndicator, CommunityToolkit.Mvvm, RefreshView&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Steckbrief&lt;br /&gt;
| gilt_fuer   = .NET MAUI 9/10, CommunityToolkit.Mvvm 8.x&lt;br /&gt;
| bereich     = Softwareentwicklung&lt;br /&gt;
| dauer       = ca. 15 Minuten&lt;br /&gt;
| rechte      = Entwicklungsumgebung&lt;br /&gt;
| stand       = Oktober 2026&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Eine Ladeanzeige in .NET MAUI&amp;#039;&amp;#039;&amp;#039; zeigt dem Benutzer, dass die App gerade Daten lädt – etwa beim Abruf einer Kundenliste aus dem Netz. Mit einer &amp;lt;code&amp;gt;IsBusy&amp;lt;/code&amp;gt;-Eigenschaft im ViewModel und einem daran gebundenen &amp;lt;code&amp;gt;ActivityIndicator&amp;lt;/code&amp;gt; entsteht die Anzeige einmal in XAML und funktioniert auf Android, iOS und Windows gleichermaßen. Die frühere Xamarin-Lösung mit getrenntem Code für &amp;lt;code&amp;gt;ProgressBar&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;UIActivityIndicatorView&amp;lt;/code&amp;gt; entfällt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:NET-MAUI-Ladeanzeige.png|thumb|center|750px|Ladeanzeige in .NET MAUI: IsBusy im ViewModel steuert per Binding den ActivityIndicator; finally setzt die Anzeige auch bei Fehlern zurück.]]&lt;br /&gt;
&lt;br /&gt;
== ViewModel mit IsBusy ==&lt;br /&gt;
Mit dem &amp;#039;&amp;#039;&amp;#039;CommunityToolkit.Mvvm&amp;#039;&amp;#039;&amp;#039; erzeugt ein Attribut die Eigenschaften samt Änderungsbenachrichtigung automatisch:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using CommunityToolkit.Mvvm.ComponentModel;&lt;br /&gt;
using CommunityToolkit.Mvvm.Input;&lt;br /&gt;
&lt;br /&gt;
public partial class KundenViewModel(IKundenService kundenService) : ObservableObject&lt;br /&gt;
{&lt;br /&gt;
    [ObservableProperty]&lt;br /&gt;
    [NotifyPropertyChangedFor(nameof(IsNotBusy))]&lt;br /&gt;
    private bool isBusy;&lt;br /&gt;
&lt;br /&gt;
    [ObservableProperty]&lt;br /&gt;
    private string? fehlermeldung;&lt;br /&gt;
&lt;br /&gt;
    public bool IsNotBusy =&amp;gt; !IsBusy;&lt;br /&gt;
&lt;br /&gt;
    public ObservableCollection&amp;lt;Kunde&amp;gt; Kunden { get; } = [];&lt;br /&gt;
&lt;br /&gt;
    [RelayCommand]&lt;br /&gt;
    private async Task LadenAsync(int landId)&lt;br /&gt;
    {&lt;br /&gt;
        if (IsBusy) return;                       // Doppelklick verhindern&lt;br /&gt;
        try&lt;br /&gt;
        {&lt;br /&gt;
            IsBusy = true;&lt;br /&gt;
            Fehlermeldung = null;&lt;br /&gt;
            Kunden.Clear();&lt;br /&gt;
            foreach (var k in await kundenService.GetKundenNachLandAsync(landId))&lt;br /&gt;
                Kunden.Add(k);&lt;br /&gt;
        }&lt;br /&gt;
        catch (Exception ex)&lt;br /&gt;
        {&lt;br /&gt;
            Fehlermeldung = &amp;quot;Daten konnten nicht geladen werden.&amp;quot;;&lt;br /&gt;
            System.Diagnostics.Debug.WriteLine(ex);&lt;br /&gt;
        }&lt;br /&gt;
        finally&lt;br /&gt;
        {&lt;br /&gt;
            IsBusy = false;                       // auch bei Fehlern zurücksetzen&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Das Attribut &amp;lt;code&amp;gt;[RelayCommand]&amp;lt;/code&amp;gt; erzeugt den Befehl &amp;lt;code&amp;gt;LadenCommand&amp;lt;/code&amp;gt;; die Methode ist &amp;lt;code&amp;gt;async Task&amp;lt;/code&amp;gt; statt &amp;lt;code&amp;gt;async void&amp;lt;/code&amp;gt;, damit Ausnahmen nicht verloren gehen.&lt;br /&gt;
&lt;br /&gt;
== Oberfläche in XAML ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentPage xmlns=&amp;quot;http://schemas.microsoft.com/dotnet/2021/maui&amp;quot;&lt;br /&gt;
             xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2009/xaml&amp;quot;&lt;br /&gt;
             xmlns:vm=&amp;quot;clr-namespace:MeineApp.ViewModels&amp;quot;&lt;br /&gt;
             x:Class=&amp;quot;MeineApp.Views.KundenPage&amp;quot;&lt;br /&gt;
             x:DataType=&amp;quot;vm:KundenViewModel&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;Grid&amp;gt;&lt;br /&gt;
        &amp;lt;CollectionView ItemsSource=&amp;quot;{Binding Kunden}&amp;quot;&lt;br /&gt;
                        IsVisible=&amp;quot;{Binding IsNotBusy}&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;!-- ItemTemplate … --&amp;gt;&lt;br /&gt;
        &amp;lt;/CollectionView&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;ActivityIndicator IsRunning=&amp;quot;{Binding IsBusy}&amp;quot;&lt;br /&gt;
                           IsVisible=&amp;quot;{Binding IsBusy}&amp;quot;&lt;br /&gt;
                           Color=&amp;quot;{StaticResource Primary}&amp;quot;&lt;br /&gt;
                           HorizontalOptions=&amp;quot;Center&amp;quot;&lt;br /&gt;
                           VerticalOptions=&amp;quot;Center&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Label Text=&amp;quot;{Binding Fehlermeldung}&amp;quot; TextColor=&amp;quot;Red&amp;quot;&lt;br /&gt;
               VerticalOptions=&amp;quot;End&amp;quot; Margin=&amp;quot;16&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/ContentPage&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;x:DataType&amp;lt;/code&amp;gt; aktiviert &amp;#039;&amp;#039;&amp;#039;kompilierte Bindungen&amp;#039;&amp;#039;&amp;#039; – schneller und mit Fehlerprüfung beim Build.&lt;br /&gt;
&lt;br /&gt;
=== Laden beim Öffnen der Seite ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
protected override async void OnAppearing()&lt;br /&gt;
{&lt;br /&gt;
    base.OnAppearing();&lt;br /&gt;
    if (BindingContext is KundenViewModel vm &amp;amp;&amp;amp; vm.Kunden.Count == 0)&lt;br /&gt;
        await vm.LadenCommand.ExecuteAsync(49);   // Beispiel: Land-ID&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Alternative: Pull-to-Refresh ==&lt;br /&gt;
Für Listen, die der Benutzer selbst aktualisieren soll, ist ein &amp;lt;code&amp;gt;RefreshView&amp;lt;/code&amp;gt; oft eleganter – er bringt eine eigene Ladeanimation mit:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;RefreshView IsRefreshing=&amp;quot;{Binding IsBusy}&amp;quot; Command=&amp;quot;{Binding LadenCommand}&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;CollectionView ItemsSource=&amp;quot;{Binding Kunden}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/RefreshView&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nicht &amp;lt;code&amp;gt;Page.IsBusy&amp;lt;/code&amp;gt; verwenden:&amp;#039;&amp;#039;&amp;#039; Die eingebaute Eigenschaft der Seite ist in .NET MAUI 10 als veraltet markiert. Eine eigene &amp;lt;code&amp;gt;IsBusy&amp;lt;/code&amp;gt;-Eigenschaft im ViewModel wie oben ist der empfohlene Weg.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;CollectionView statt ListView:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;ListView&amp;lt;/code&amp;gt; ist in .NET 10 ebenfalls veraltet.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Lange Vorgänge:&amp;#039;&amp;#039;&amp;#039; Bei Ladezeiten über einigen Sekunden zusätzlich einen Abbrechen-Knopf und einen Fortschrittstext anbieten.&lt;br /&gt;
* Bei der Entwicklung benutzerfreundlicher Apps unterstützt Sie die [https://www.max-it.de/development/individuelle-softwareentwicklung/ individuelle Softwareentwicklung von m.a.x. it].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[.NET MAUI: MVVM mit dem CommunityToolkit.Mvvm statt MvvmLight]]&lt;br /&gt;
* [[Von Xamarin zu .NET MAUI migrieren]]&lt;br /&gt;
* [[Dependency Injection]]&lt;br /&gt;
&lt;br /&gt;
== Links und Quellen ==&lt;br /&gt;
* [https://learn.microsoft.com/de-de/dotnet/maui/user-interface/controls/activityindicator Microsoft Learn: ActivityIndicator in .NET MAUI]&lt;br /&gt;
* [https://www.max-it.de/development/individuelle-softwareentwicklung/ Individuelle Softwareentwicklung und App-Entwicklung von m.a.x. it]&lt;br /&gt;
&lt;br /&gt;
{{Uebermax}}&lt;br /&gt;
[[Kategorie:Softwareentwicklung]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;TechCorner-Redaktion</name></author>
	</entry>
</feed>