Early Access Preview (v24.2)
Ease of Use and IDE Integration
How long does it take to go from a blank page to a fully functional view? While the amount of time varies by project, the process typically involves the following steps:
- Designing a mockup
- Selecting appropriate UI components
- Setting up control APIs
- Implementing a view model to interact with business logic
In addition to templates, we're planning to introduce a toolbox packed with predefined XAML blocks, allowing you to design views by dragging items from the toolbox.

MVVM
Services
The following is a list of services our MVVM library includes:
NavigationService
. Navigate between pages directly from your view model.PrintService
. Launch the default print dialog to print files.SaveFilePicker
. Open a dialog and allow users to save a file.
public class ViewModel
{
public ViewModel(INavigationService navigationService,
IPrintService printService,
ISaveFilePicker saveFilePickerService)
{
//navigationService.GoToAsync(...);
//printService.PrintAsync(...);
//saveFilePickerService.SaveAsync(...);
}
}
If you prefer to use your own custom service implementation, you can register it in the DI container to override the default registration:
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
//...
builder.Services.AddSingleton<INavigationService, NavigationServiceEx>();
}
}
public class NavigationServiceEx : NavigationService { }
DXCollectionView.ScrollTo
:public interface IScollService {
void ScrollToEnd();
}
public class ScollService : UIServiceBase, IScollService
{
public void ScrollToEnd()
{
DXCollectionView collection = (DXCollectionView)AssociatedObject;
collection.ScrollTo(collection.VisibleItemCount, DXScrollToPosition.End);
}
}
DXCollectionView
:<dx:DXCollectionView>
<dx:DXCollectionView.Behaviors>
<local:ScollService/>
</dx:DXCollectionView.Behaviors>
</dx:DXCollectionView >
In your view model, you can access the registered service via the service container and trigger UI-related actions through the service interface: public partial class ViewModel : IUIServiceClient
{
public IUIServiceContainer ServiceContainer { get; } = new UIServiceContainer();
void ShowLastItem()
{
var scrollService = ServiceContainer.GetRequiredService<IScollService>();
scrollService.ScrollToEnd();
}
}
This technique allows you to invoke UI actions in a clean, MVVM-compliant manner.
Dependency Injection
To simplify Dependency Injection, we've created a markup extension that allows you to assign a view model from the DI container directly in XAML:
<ContentPage ...
xmlns:dx="http://schemas.devexpress.com/maui"
BindingContext="{dx:Ioc Type={x:Type vm:MainViewModel}}">
public static class MauiProgram {
public static MauiApp CreateMauiApp() {
//...
builder.Services.AddTransient<ViewModel>();
}
}
With this extension, there's no need to create a constructor in your view to pass the view model and manually assign it to BindingContext
:
//not required anymore
public MainPage(ViewModel viewModel)
{
BindingContext = viewModel;
InitializeComponent();
}
The Ioc
extension allows you to inject a view model into a view, even if the view itself isn't registered in the DI container. This will be useful when you have a ContentView
embedded within a parent page in XAML.
<ContentPage ...
x:Class="MauiExample.MainPage" >
<views:ChildContentView/>
<!--...-->
</ContentPage>
<ContentView ...
x:Class=" MauiExample.ChildContentView"
BindingContext="{dx:Ioc Type={x:Type vm:ChildViewModel}}">
<!--...-->
</ContentView>
Collection View – Frozen Group Row
You can now keep group row headers visible while scrolling, as long as at least one child row in the group is on screen. Enable the DXCollectionView.AllowFixedGroupHeaders
option to incorporate this feature in your DevExpress-powered .NET MAUI app.

Asynchronous CRUD
As you know, both our .NET MAUI Collection View and .NET MAUI Data Grid controls include CRUD APIs to help you create detail and edit item forms. Since mobile apps often need to connect to remote services for data editing purposes, we've enhanced our CRUD APIs to support asynchronous operations.
Both the Collection View and Data Grid use CRUD view models to automatically transfer information between detail/edit views and handle actions like edit, save, and delete operations. We've made these commands asynchronous, so you can now execute them without freezing the UI. Additionally, we've added an IsAsyncOperationInProgress
property. This property allows you to display a loading indicator during asynchronous operations.
Data Grid Multi Selection
You can now enable multiple row selection in our Data Grid. Simply set DataGridView.SelectionMode
to Multiple
to activate this feature.

To retrieve selected rows in your view model, bind DataGridView.SelectedItems
to a ObservableCollection<T>
property type.
Minor Update (v24.1)
The following is a quick overview of new features included in recent minor updates. These features are included in our official releases, so you can start using them immediately by updating your NuGet packages to the most recent version.
Collection View & Tree View – Header & Footer
Headers and footers allow you to add custom elements above and below list items. Since they scroll alongside the rest of the view, this new feature helps make efficient use of available screen space. You can define any content for your header/footer (display elements that stand out from the rest of the list).
Here are a few ways to use headers and footers:
- Display favorite items at the top.
- Add a collection title.
- Include a button to add more items or display the full list.
Collection View & Data Grid – Unlimited Height
Data Grid Immediate Posting
PDF Viewer Print Command
We implemented a class to invoke native device printing dialogs. This feature is accessible via a built-in toolbar item in our .NET MAUI PDF Viewer control (or directly in code).

To invoke the dialog in code, call PdfViewer.PrintDocumentAsync.
Optimized Property Initialization
Chat Control Example

- Chat-inspired custom styled visual elements (DXCollectionView, TextEdit, DXButton).
- Buttons for quick responses.
- A fully-functional view model and basic business logic.