Xamarin.Forms
अनिवार्य तथ्य
खोज…
टिप्पणियों
संभव अपवाद
System.ArrayTypeMismatchException: किसी तत्व को सरणी के साथ असंगत के रूप में एक्सेस करने का प्रयास किया गया है।
यह अपवाद तब हो सकता है जब एक संग्रह को गैर-बाइंड करने योग्य संपत्ति के लिए बाध्य करने का प्रयास किया जाता है जब XAML पूर्व-संकलन सक्षम होता है। एक सामान्य उदाहरण Picker.Items
लिए बाँधने का प्रयास है। निचे देखो।
System.ArgumentException: 'Xamarin.Forms.Binding' प्रकार की वस्तु को 'System.String' प्रकार में परिवर्तित नहीं किया जा सकता है।
यह अपवाद तब हो सकता है जब एक संग्रह को गैर-बाइंड करने योग्य संपत्ति के लिए बाध्य करने का प्रयास किया जाता है जब XAML पूर्व-संकलन अक्षम होता है। एक सामान्य उदाहरण Picker.Items
लिए बाँधने का प्रयास है। निचे देखो।
Picker.Items
। Picker.Items
प्रॉपर्टी इज नॉट Picker.Items
यह कोड त्रुटि का कारण बनेगा:
<!-- BAD CODE: will cause an error -->
<Picker Items="{Binding MyViewModelItems}" SelectedIndex="0" />
अपवाद निम्नलिखित में से एक हो सकता है:
System.ArrayTypeMismatchException: किसी तत्व को सरणी के साथ असंगत के रूप में एक्सेस करने का प्रयास किया गया है।
या
System.ArgumentException: 'Xamarin.Forms.Binding' प्रकार की वस्तु को 'System.String' प्रकार में परिवर्तित नहीं किया जा सकता है।
विशेष रूप से, Items
गुण गैर-बाइंडेबल है। समाधान में अपना स्वयं का कस्टम नियंत्रण बनाना या तृतीय-पक्ष नियंत्रण का उपयोग करना शामिल है, जैसे कि FreshEssentials से BindablePicker
। अपनी परियोजना में FreshEssentials NuGet पैकेज को स्थापित करने के बाद, पैकेज के BindablePicker
एक bindable साथ नियंत्रण ItemsSource
संपत्ति उपलब्ध है:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:fe="clr-namespace:FreshEssentials;assembly=FreshEssentials"
xmlns:my="clr-namespace:MyAssembly;assembly=MyAssembly"
x:Class="MyNamespace.MyPage">
<ContentPage.BindingContext>
<my:MyViewModel />
</ContentPage.BindingContext>
<ContentPage.Content>
<fe:BindablePicker ItemsSource="{Binding MyViewModelItems}" SelectedIndex="0" />
</ContentPage.Content>
</ContentPage>
ViewModel के लिए बुनियादी बंधन
EntryPage.xaml:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:vm="clr-namespace:MyAssembly.ViewModel;assembly=MyAssembly"
x:Class="MyAssembly.EntryPage">
<ContentPage.BindingContext>
<vm:MyViewModel />
</ContentPage.BindingContext>
<ContentPage.Content>
<StackLayout VerticalOptions="FillAndExpand"
HorizontalOptions="FillAndExpand"
Orientation="Vertical"
Spacing="15">
<Label Text="Name:" />
<Entry Text="{Binding Name}" />
<Label Text="Phone:" />
<Entry Text="{Binding Phone}" />
<Button Text="Save" Command="{Binding SaveCommand}" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
MyViewModel.cs:
using System;
using System.ComponentModel;
namespace MyAssembly.ViewModel
{
public class MyViewModel : INotifyPropertyChanged
{
private string _name = String.Empty;
private string _phone = String.Empty;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
}
public string Phone
{
get { return _phone; }
set
{
if (_phone != value)
{
_phone = value;
OnPropertyChanged(nameof(Phone));
}
}
}
public ICommand SaveCommand { get; private set; }
public MyViewModel()
{
SaveCommand = new Command(SaveCommandExecute);
}
private void SaveCommandExecute()
{
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}