Zoeken…


Opmerkingen

Mogelijke uitzonderingen

System.ArrayTypeMismatchException: geprobeerd een element te openen als een type dat niet compatibel is met de array.

Deze uitzondering kan optreden wanneer u probeert een verzameling te binden aan een niet-bindende eigenschap wanneer XAML-voorcompilatie is ingeschakeld. Een veelvoorkomend voorbeeld is het proberen te binden aan Picker.Items . Zie hieronder.

System.ArgumentException: Object van het type 'Xamarin.Forms.Binding' kan niet worden geconverteerd naar het type 'System.String'.

Deze uitzondering kan optreden wanneer u probeert een verzameling te binden aan een niet-bindende eigenschap wanneer XAML-voorcompilatie is uitgeschakeld. Een veelvoorkomend voorbeeld is het proberen te binden aan Picker.Items . Zie hieronder.

De Picker.Items is niet bindend

Deze code veroorzaakt een fout:

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

De uitzondering kan een van de volgende zijn:

System.ArrayTypeMismatchException: geprobeerd een element te openen als een type dat niet compatibel is met de array.

of

System.ArgumentException: Object van het type 'Xamarin.Forms.Binding' kan niet worden geconverteerd naar het type 'System.String'.

In het bijzonder is de eigenschap Items niet bindend. Oplossingen omvatten het maken van uw eigen aangepaste besturingselement of het gebruik van een besturingselement van derden, zoals BindablePicker van FreshEssentials . Na het installeren van het FreshEssentials NuGet-pakket in uw project, is het BindablePicker besturingselement van het pakket met een bindende ItemsSource eigenschap beschikbaar:

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

Basic binding aan 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow