Sök…


Anmärkningar

Möjliga undantag

System.ArrayTypeMismatchException: Försökt komma åt ett element som en typ som är oförenlig med matrisen.

Detta undantag kan inträffa när man försöker binda en samling till en ej bindbar egenskap när XAML-förkompileringen är aktiverad. Ett vanligt exempel är att försöka binda till Picker.Items . Se nedan.

System.ArgumentException: Objekt av typen 'Xamarin.Forms.Binding' kan inte konverteras till typen 'System.String'.

Detta undantag kan inträffa när man försöker binda en samling till en ej bindbar egenskap när XAML-förkompileringen är inaktiverad. Ett vanligt exempel är att försöka binda till Picker.Items . Se nedan.

Picker.Items egendom är inte bindbar

Den här koden orsakar ett fel:

<!-- BAD CODE: will cause an error -->
<Picker Items="{Binding MyViewModelItems}" SelectedIndex="0" />

Undantaget kan vara ett av följande:

System.ArrayTypeMismatchException: Försökt komma åt ett element som en typ som är oförenlig med matrisen.

eller

System.ArgumentException: Objekt av typen 'Xamarin.Forms.Binding' kan inte konverteras till typen 'System.String'.

Specifikt Items är fastigheten inte kan bindas. Lösningar inkluderar att skapa din egen anpassade kontroll eller använda en tredjepartskontroll, till exempel BindablePicker från FreshEssentials . Efter att ha installerat FreshEssentials NuGet-paketet i ditt projekt, är paketets BindablePicker kontroll med en bindbar ItemsSource egenskap tillgänglig:

<?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>

Grundläggande bindning till 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow