Suche…


Bemerkungen

Mögliche Ausnahmen

System.ArrayTypeMismatchException: Es wurde versucht, auf ein Element als Typ zuzugreifen, der mit dem Array nicht kompatibel ist.

Diese Ausnahme kann auftreten, wenn versucht wird, eine Auflistung an eine nicht bindbare Eigenschaft zu binden, wenn die XAML-Vorkompilierung aktiviert ist. Ein bekanntes Beispiel ist der Versuch, an Picker.Items zu binden. Siehe unten.

System.ArgumentException: Objekt vom Typ 'Xamarin.Forms.Binding' kann nicht in den Typ 'System.String' konvertiert werden.

Diese Ausnahme kann auftreten, wenn versucht wird, eine Auflistung an eine nicht bindbare Eigenschaft zu binden, wenn die XAML-Vorkompilierung deaktiviert ist. Ein bekanntes Beispiel ist der Versuch, an Picker.Items zu binden. Siehe unten.

Die Picker.Items Eigenschaft ist nicht bindbar

Dieser Code verursacht einen Fehler:

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

Die Ausnahme kann eine der folgenden sein:

System.ArrayTypeMismatchException: Es wurde versucht, auf ein Element als Typ zuzugreifen, der mit dem Array nicht kompatibel ist.

oder

System.ArgumentException: Objekt vom Typ 'Xamarin.Forms.Binding' kann nicht in den Typ 'System.String' konvertiert werden.

Die Items Eigenschaft ist insbesondere nicht bindbar. Zu den Lösungen zählen das Erstellen eines eigenen benutzerdefinierten Steuerelements oder das Verwenden eines Steuerelements eines Drittanbieters, z. B. BindablePicker von FreshEssentials . Nach der Installation des FreshEssentials NuGet-Pakets in Ihrem Projekt ist das BindablePicker Steuerelement des Pakets mit einer ItemsSource Eigenschaft verfügbar:

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

Grundlegende Bindung an 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow