Xamarin.Forms
데이터 바인딩
수색…
비고
가능한 예외
System.ArrayTypeMismatchException : 배열과 호환되지 않는 형식으로 요소에 액세스하려고 시도했습니다.
이 예외는 XAML 사전 컴파일을 사용할 때 컬렉션을 바인딩 할 수없는 속성에 바인딩하려고 할 때 발생할 수 있습니다. 일반적인 예는 Picker.Items
에 바인딩하려고 시도하는 Picker.Items
입니다. 아래를 참조하십시오.
System.ArgumentException : 'Xamarin.Forms.Binding'형식의 개체를 'System.String'형식으로 변환 할 수 없습니다.
이 예외는 XAML 사전 컴파일을 사용할 수 없을 때 컬렉션을 바인딩 할 수없는 속성에 바인딩하려고 할 때 발생할 수 있습니다. 일반적인 예는 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 패키지를 설치하면 바인딩 가능한 ItemsSource
속성이있는 패키지의 BindablePicker
컨트롤을 사용할 수 있습니다.
<?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