diff --git a/Directory.Packages.props b/Directory.Packages.props
index 56e0d4c..ac7e952 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -10,9 +10,9 @@
-
+
-
+
@@ -20,9 +20,9 @@
-
+
-
+
diff --git a/docs/tutorial/client/part-1.md b/docs/tutorial/client/part-1.md
index 69a7448..67fb057 100644
--- a/docs/tutorial/client/part-1.md
+++ b/docs/tutorial/client/part-1.md
@@ -216,4 +216,4 @@ In the [next tutorial](./part-2.md), I'm going to talk about authenticating clie
[todomvc]: https://github.com/CommunityToolkit/Datasync/tree/main/samples/todoapp-mvc
[todoapp]: https://github.com/CommunityToolkit/Datasync/tree/main/samples/todoapp-tutorial
[CommunityToolkit.MVVM]: https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/
-[CommunityToolkit.Datasync.Client]: https://www.nuget.org/packages/CommunityToolkit.Datasync.Client#readme-body-tab
\ No newline at end of file
+[CommunityToolkit.Datasync.Client]: https://www.nuget.org/packages/CommunityToolkit.Datasync.Client#readme-body-tab
diff --git a/samples/datasync-server/src/Sample.Datasync.Server/Sample.Datasync.Server.csproj b/samples/datasync-server/src/Sample.Datasync.Server/Sample.Datasync.Server.csproj
index 76b7ea2..06b2470 100644
--- a/samples/datasync-server/src/Sample.Datasync.Server/Sample.Datasync.Server.csproj
+++ b/samples/datasync-server/src/Sample.Datasync.Server/Sample.Datasync.Server.csproj
@@ -7,14 +7,14 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/samples/todoapp-mvc/TodoApp.Service/TodoApp.Service.csproj b/samples/todoapp-mvc/TodoApp.Service/TodoApp.Service.csproj
index 4fbb088..154c87b 100644
--- a/samples/todoapp-mvc/TodoApp.Service/TodoApp.Service.csproj
+++ b/samples/todoapp-mvc/TodoApp.Service/TodoApp.Service.csproj
@@ -7,10 +7,10 @@
-
-
-
-
+
+
+
+
diff --git a/samples/todoapp-tutorial/ClientApp/App.xaml.cs b/samples/todoapp-tutorial/ClientApp/App.xaml.cs
index 99c87d2..8861082 100644
--- a/samples/todoapp-tutorial/ClientApp/App.xaml.cs
+++ b/samples/todoapp-tutorial/ClientApp/App.xaml.cs
@@ -1,4 +1,4 @@
-using ClientApp.Interfaces;
+using ClientApp.Interfaces;
using ClientApp.Services;
using ClientApp.ViewModels;
using Microsoft.Extensions.DependencyInjection;
@@ -29,7 +29,7 @@ private void InitializeApplication()
{
using IServiceScope scope = Services.CreateScope();
IAppInitializer initializer = scope.ServiceProvider.GetRequiredService();
- initializer.Initialize();
+ _ = initializer.Initialize();
}
///
diff --git a/samples/todoapp-tutorial/ClientApp/ClientApp.csproj b/samples/todoapp-tutorial/ClientApp/ClientApp.csproj
index bb90436..932370b 100644
--- a/samples/todoapp-tutorial/ClientApp/ClientApp.csproj
+++ b/samples/todoapp-tutorial/ClientApp/ClientApp.csproj
@@ -9,7 +9,7 @@
-
+
diff --git a/samples/todoapp-tutorial/ClientApp/Converters/BooleanToImageConverter.cs b/samples/todoapp-tutorial/ClientApp/Converters/BooleanToImageConverter.cs
index 6993ae7..4d6c53d 100644
--- a/samples/todoapp-tutorial/ClientApp/Converters/BooleanToImageConverter.cs
+++ b/samples/todoapp-tutorial/ClientApp/Converters/BooleanToImageConverter.cs
@@ -1,3 +1,7 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media.Imaging;
diff --git a/samples/todoapp-tutorial/ClientApp/MainWindow.xaml b/samples/todoapp-tutorial/ClientApp/MainWindow.xaml
index 4255fae..8767fcf 100644
--- a/samples/todoapp-tutorial/ClientApp/MainWindow.xaml
+++ b/samples/todoapp-tutorial/ClientApp/MainWindow.xaml
@@ -1,4 +1,4 @@
- items = [];
+
+ [ObservableProperty]
+ private string addItemTitle = string.Empty;
+
+ [RelayCommand]
+ public async Task AddItemAsync(CancellationToken cancellationToken = default)
+ {
+ try
+ {
+ var addition = await todoService.AddTodoItemAsync(AddItemTitle, cancellationToken);
+ Items.Add(addition);
+ AddItemTitle = string.Empty;
+ }
+ catch (Exception ex)
+ {
+ await alertService.ShowErrorAlertAsync("Error adding item", ex.Message);
+ }
+ }
+
+ [RelayCommand]
+ public async Task UpdateItemAsync(TodoItem item, CancellationToken cancellationToken = default)
+ {
+ try
+ {
+ TodoItem? storedItem = await todoService.GetTodoItemAsync(item.Id, cancellationToken);
+ if (storedItem is not null)
+ {
+ storedItem.IsComplete = !storedItem.IsComplete;
+ var replacedItem = await todoService.ReplaceTodoItemAsync(storedItem, cancellationToken);
+ var idx = Items.IndexOf(item);
+ Items[idx] = replacedItem;
+ }
+ else
+ {
+ await alertService.ShowErrorAlertAsync("Item not found", "The item was not found in the database.");
+ }
+ }
+ catch (Exception ex)
+ {
+ await alertService.ShowErrorAlertAsync("Error updating item", ex.Message);
+ }
+ }
+
+ [RelayCommand]
+ public async Task RefreshItemsAsync(CancellationToken cancellationToken = default)
+ {
+ try
+ {
+ IsRefreshing = true;
+ List dbItems = await todoService.GetAllTodoItemsAsync(cancellationToken);
+ Items.Clear();
+ foreach (var dbItem in dbItems)
+ {
+ Items.Add(dbItem);
+ }
+ }
+ catch (Exception ex)
+ {
+ await alertService.ShowErrorAlertAsync("Error refreshing items", ex.Message);
+ }
+ finally
+ {
+ IsRefreshing = false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/todoapp-tutorial/ServerApp/ServerApp.csproj b/samples/todoapp-tutorial/ServerApp/ServerApp.csproj
index 3b630dd..b3b1f2b 100644
--- a/samples/todoapp-tutorial/ServerApp/ServerApp.csproj
+++ b/samples/todoapp-tutorial/ServerApp/ServerApp.csproj
@@ -7,8 +7,8 @@
-
-
+
+
diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/TodoApp.Avalonia.Android.csproj b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/TodoApp.Avalonia.Android.csproj
index 5a7d5c5..70c8d49 100644
--- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/TodoApp.Avalonia.Android.csproj
+++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/TodoApp.Avalonia.Android.csproj
@@ -18,11 +18,11 @@
-
-
+
+
-
+
diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Desktop/TodoApp.Avalonia.Desktop.csproj b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Desktop/TodoApp.Avalonia.Desktop.csproj
index 639fe2b..cd1eeae 100644
--- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Desktop/TodoApp.Avalonia.Desktop.csproj
+++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Desktop/TodoApp.Avalonia.Desktop.csproj
@@ -13,12 +13,12 @@
-
+
-
+
-
+
diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj
index 1f2c8ef..fd463bc 100644
--- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj
+++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj
@@ -7,10 +7,10 @@
-
+
-
+
diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/TodoApp.Avalonia.csproj b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/TodoApp.Avalonia.csproj
index 5183165..cda4c5c 100644
--- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/TodoApp.Avalonia.csproj
+++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/TodoApp.Avalonia.csproj
@@ -7,17 +7,17 @@
-
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
diff --git a/samples/todoapp/TodoApp.MAUI/TodoApp.MAUI.csproj b/samples/todoapp/TodoApp.MAUI/TodoApp.MAUI.csproj
index ab34c60..16cf5aa 100644
--- a/samples/todoapp/TodoApp.MAUI/TodoApp.MAUI.csproj
+++ b/samples/todoapp/TodoApp.MAUI/TodoApp.MAUI.csproj
@@ -50,10 +50,10 @@
-
+
-
-
+
+
diff --git a/samples/todoapp/TodoApp.WPF/TodoApp.WPF.csproj b/samples/todoapp/TodoApp.WPF/TodoApp.WPF.csproj
index aa575cd..9233af2 100644
--- a/samples/todoapp/TodoApp.WPF/TodoApp.WPF.csproj
+++ b/samples/todoapp/TodoApp.WPF/TodoApp.WPF.csproj
@@ -20,6 +20,6 @@
-
+
diff --git a/samples/todoapp/TodoApp.WinUI3/TodoApp.WinUI3.csproj b/samples/todoapp/TodoApp.WinUI3/TodoApp.WinUI3.csproj
index f995d30..131be15 100644
--- a/samples/todoapp/TodoApp.WinUI3/TodoApp.WinUI3.csproj
+++ b/samples/todoapp/TodoApp.WinUI3/TodoApp.WinUI3.csproj
@@ -29,13 +29,13 @@
-
+
-
-
-
+
+
+