An abp.io BookStore sample including a more complete wpf example using mvvm source generators and a slick UI 😍
This app utilizes the CommunityToolkit.Mvvm
source generators details.
This makes it so we can cut loads of boilerplate out like this:
In BookIndexViewModel.cs
[RelayCommand]
public async Task InitialAsync()
{
await LoadDataAsync();
}
In BookIndex.xaml
<Behaviors:InvokeCommandAction Command="{Binding InitialCommand}"/>
The source generators take care of generating the command property and setting it up (what you would normally do in the constructor).
You can even handle the CanExecute simply:
public bool GetIsNotBusy() => IsNotBusy;
[RelayCommand(CanExecute = "GetIsNotBusy", AllowConcurrentExecutions = true)]
public async Task InitialAsync()
{
await LoadDataAsync();
}
Note: As of right now, the CanExecute of the source generator can't seem to see the base property of IsNotBusy
so this is a simple workaround.
AppViewModel
exposes the Abp l18n via L
so you can use it in the xaml like this:
<wpfui:NavigationItem
Content="{Binding Path=L[Books]}" />
Where Books
is the l18n key:
{
"culture": "en",
"texts": {
"Menu:Home": "Home",
"Welcome": "Welcome",
"LongWelcomeMessage": "Welcome to the application. This is a startup project based on the ABP framework. For more information, visit abp.io.",
"Books": "BoOkS"
}
}
Check out the project Acme.BookStore.Wpf.Tests
which is an adaptation of the Web tests specifically for testing the view models.