खोज…


टिप्पणियों

संभव अपवाद

System.ArrayTypeMismatchException: किसी तत्व को सरणी के साथ असंगत के रूप में एक्सेस करने का प्रयास किया गया है।

यह अपवाद तब हो सकता है जब एक संग्रह को गैर-बाइंड करने योग्य संपत्ति के लिए बाध्य करने का प्रयास किया जाता है जब XAML पूर्व-संकलन सक्षम होता है। एक सामान्य उदाहरण Picker.Items लिए बाँधने का प्रयास है। निचे देखो।

System.ArgumentException: 'Xamarin.Forms.Binding' प्रकार की वस्तु को 'System.String' प्रकार में परिवर्तित नहीं किया जा सकता है।

यह अपवाद तब हो सकता है जब एक संग्रह को गैर-बाइंड करने योग्य संपत्ति के लिए बाध्य करने का प्रयास किया जाता है जब XAML पूर्व-संकलन अक्षम होता है। एक सामान्य उदाहरण Picker.Items लिए बाँधने का प्रयास है। निचे देखो।

Picker.ItemsPicker.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));
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow