Category / Section
How to bind data object in Xamarin.Forms DataForm(SfDataForm) using Prism framework?
2 mins read
The SfDataForm allows you to work with Prism framework. To achieve this, follow these steps:
Step 1: Install the Prism Unity Forms NuGet package in your shared code project.
Step 2: Inherit the App.xaml and App.xaml.cs files from PrismApplication instead of Application.
XAML
<prism:PrismApplication xmlns:prism="clr-namespace:Prism.Unity;assembly=Prism.Unity.Forms" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="DataFormXamarin.App"> <Application.Resources> </Application.Resources> </prism:PrismApplication>
C#
public partial class App : PrismApplication { public App(IPlatformInitializer initializer = null) : base(initializer) { } protected override async void OnInitialized() { InitializeComponent(); await NavigationService.NavigateAsync("DataFormPage"); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { } }
Step 3: Add platform initializers to each cross-platform project. Create a new class that implements IPlatformInitializer and pass it to the LoadApplication method on each platform.
Android
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) { TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App(new AndroidInitializer())); } } public class AndroidInitializer : IPlatformInitializer { public void RegisterTypes(IContainerRegistry containerRegistry) { // Register any platform specific implementations } }
iOS
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate { // // This method is invoked when the application has loaded and is ready to run. In this // Method you should instantiate the window, load the UI into it and then make the window // Visible // // You have 17 seconds to return from this method, or iOS will terminate your application // public override bool FinishedLaunching(UIApplication app, NSDictionary options) { global::Xamarin.Forms.Forms.Init(); SfDataFormRenderer.Init(); LoadApplication(new App(new iOSInitializer())); return base.FinishedLaunching(app, options); } public class iOSInitializer : IPlatformInitializer { public void RegisterTypes(IContainerRegistry containerRegistry) { // Register any platform specific implementations } } }
UWP
public sealed partial class MainPage { public MainPage() { this.InitializeComponent(); LoadApplication(new DataFormXamarin.App(new UwpInitializer())); } } public class UwpInitializer : IPlatformInitializer { public void RegisterTypes(IContainerRegistry containerRegistry) { // Register any platform specific implementations } }
Step 4: In App.xaml.cs file, register the View and respective ViewModel pages.
protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation<DataFormPage, DataFormViewModel>(); }
Step 5: Bind data to the DataForm’s DataObject property without mentioning the binding context.
<dataForm:SfDataForm x:Name="dataForm" LayoutOptions="TextInputLayout" DataObject="{Binding ContactsInfo}"/>
Download the sample from GitHub.