바인딩 가능한 속성Bindable Properties

샘플 다운로드 샘플 다운로드Download Sample Download the sample

Xamarin.Forms에서 공용 언어 런타임 (CLR) 속성의 기능 바인딩 가능한 속성으로 확장 됩니다. 바인딩 가능한 속성을 속성의 값 Xamarin.Forms 속성 시스템에서 추적 되는 속성의 특수 형식입니다. 이 문서에서는 바인딩 가능한 속성에 대해 소개 하 고 만들고이 사용 하는 방법을 보여 줍니다.In Xamarin.Forms, the functionality of common language runtime (CLR) properties is extended by bindable properties. A bindable property is a special type of property, where the property's value is tracked by the Xamarin.Forms property system. This article provides an introduction to bindable properties, and demonstrates how to create and consume them.

개요Overview

속성을 사용 하 여 백업 하 여 CLR 속성 기능을 확장 하는 바인딩 가능한 속성을 BindableProperty 대신 필드를 사용 하 여 속성을 지 원하는 형식.Bindable properties extend CLR property functionality by backing a property with a BindableProperty type, instead of backing a property with a field. 바인딩 가능한 속성의 목적은 데이터 바인딩, 스타일, 템플릿, 지 속성 시스템을 제공 하 고 값이 부모-자식 관계를 통해 설정.The purpose of bindable properties is to provide a property system that supports data binding, styles, templates, and values set through parent-child relationships. 또한 바인딩 가능한 속성 기본값을 속성 변경 내용을 모니터링 하는 콜백 및 속성 값의 유효성 검사를 제공할 수 있습니다.In addition, bindable properties can provide default values, validation of property values, and callbacks that monitor property changes.

다음 기능 중 하나 이상을 지원 하도록 바인딩 가능한 속성으로 속성을 구현 해야 합니다.Properties should be implemented as bindable properties to support one or more of the following features:

  • 역할을 하는 유효한 대상 데이터 바인딩에 대 한 속성입니다.Acting as a valid target property for data binding.
  • 속성을 통해 설정 된 스타일합니다.Setting the property through a style.
  • 속성의 형식에 대 한 기본값과 다른 값으로 기본 속성 값을 제공 합니다.Providing a default property value that's different from the default for the type of the property.
  • 속성의 값의 유효성을 검사 합니다.Validating the value of the property.
  • 속성 변경 내용을 모니터링 합니다.Monitoring property changes.

Xamarin.Forms 바인딩 가능한 속성의 예로 Label.Text 합니다 Button.BorderRadius , 및 StackLayout.Orientation 합니다.Examples of Xamarin.Forms bindable properties include Label.Text, Button.BorderRadius, and StackLayout.Orientation. 각 바인딩 가능한 속성에는 해당 public static readonly 형식의 속성 BindableProperty 동일한 클래스에서 노출 되는 및 바인딩 가능한 속성의 식별자입니다.Each bindable property has a corresponding public static readonly property of type BindableProperty that is exposed on the same class and that is the identifier of the bindable property. 예를 들어는 해당 바인딩 가능한 속성에 대 한 식별자를 Label.Text 속성은 Label.TextProperty 합니다.For example, the corresponding bindable property identifier for the Label.Text property is Label.TextProperty.

만들기 및 바인딩 가능한 속성 사용Creating and Consuming a Bindable Property

바인딩 가능한 속성을 만드는 프로세스는 다음과 같습니다.The process for creating a bindable property is as follows:

  1. 만들기는 BindableProperty 중 하나를 사용 하 여 인스턴스를 BindableProperty.Create 메서드 오버 로드 합니다.Create a BindableProperty instance with one of the BindableProperty.Create method overloads.
  2. 속성 접근자를 정의 합니다 BindableProperty 인스턴스.Define property accessors for the BindableProperty instance.

모든 BindableProperty UI 스레드에서 인스턴스를 만들어야 합니다.Note that all BindableProperty instances must be created on the UI thread. 즉, UI 스레드에서 실행 되는 코드에만 가져오기 하거나 바인딩 가능한 속성의 값을 설정할 수 있습니다.This means that only code that runs on the UI thread can get or set the value of a bindable property. 그러나 BindableProperty 인스턴스를 사용 하 여 UI 스레드 마샬링을 통해 다른 스레드에서 액세스할 수 있습니다 합니다 Device.BeginInvokeOnMainThread 메서드.However, BindableProperty instances can be accessed from other threads by marshaling to the UI thread with the Device.BeginInvokeOnMainThread method.

속성 만들기Creating a Property

만들려는 BindableProperty 인스턴스를 포함 하는 클래스에서 파생 되어야 합니다는 BindableObject 클래스입니다.To create a BindableProperty instance, the containing class must derive from the BindableObject class. 그러나는 BindableObject 클래스 이므로 클래스 계층에서 높은 사용자 인터페이스 기능 지원 바인딩 가능한 속성에 대 한 대부분의 클래스를 사용 합니다.However, the BindableObject class is high in the class hierarchy, so the majority of classes used for user interface functionality support bindable properties.

바인딩 가능한 속성을 선언 하 여 만들 수 있습니다는 public static readonly 형식의 속성 BindableProperty 합니다.A bindable property can be created by declaring a public static readonly property of type BindableProperty. 반환된 된 값 중 하나에 바인딩할 수 있는 속성을 설정 해야 합니다 BindableProperty.Create 메서드 오버 로드 합니다.The bindable property should be set to the returned value of one of the BindableProperty.Create method overloads. 선언 본문 내에 있어야 합니다. BindableObject 클래스를 파생 하지만 멤버 정의 외부입니다.The declaration should be within the body of BindableObject derived class, but outside of any member definitions.

최소한 식별자를 지정 해야 합니다를 만들 때를 BindableProperty , 다음 매개 변수와 함께 합니다.At a minimum, an identifier must be specified when creating a BindableProperty, along with the following parameters:

  • 이름을 합니다 BindableProperty 합니다.The name of the BindableProperty.
  • 속성의 형식입니다.The type of the property.
  • 소유 하는 개체의 형식입니다.The type of the owning object.
  • 속성의 기본값입니다.The default value for the property. 이 속성을 설정 하지 않으면 속성의 형식에 대 한 기본 값에서 다를 수 있습니다 때 항상 특정 기본 값을 반환 하는지 확인 합니다.This ensures that the property always returns a particular default value when it is unset, and it can be different from the default value for the type of the property. 기본 값은 복원 될 때를 ClearValue 바인딩 가능한 속성에서 메서드를 호출 합니다.The default value will be restored when the ClearValue method is called on the bindable property.

다음 코드에 식별자와 4 개의 필수 매개 변수의 값을 사용 하 여 바인딩 가능한 속성의 예를 보여 줍니다.The following code shows an example of a bindable property, with an identifier and values for the four required parameters:

public static readonly BindableProperty EventNameProperty =
  BindableProperty.Create ("EventName", typeof(string), typeof(EventToCommandBehavior), null);

이렇게 한 BindableProperty 명명 된 인스턴스 EventName, 형식의 string합니다.This creates a BindableProperty instance named EventName, of type string. 속성을 소유 하는 EventToCommandBehavior 클래스 및 기본 값 null합니다.The property is owned by the EventToCommandBehavior class, and has a default value of null. 바인딩 가능한 속성에 대 한 명명 규칙은 바인딩 가능한 속성 식별자에 지정 된 속성 이름과 일치 해야 하는 Create 메서드를 추가 하는 "Property"를 사용 하 여 합니다.The naming convention for bindable properties is that the bindable property identifier must match the property name specified in the Create method, with "Property" appended to it. 따라서 위의 예제에서 바인딩 가능한 속성 식별자는 EventNameProperty합니다.Therefore, in the example above, the bindable property identifier is EventNameProperty.

필요에 따라 만들면를 BindableProperty 인스턴스, 다음 매개 변수를 지정할 수 있습니다.Optionally, when creating a BindableProperty instance, the following parameters can be specified:

  • 바인딩 모드입니다.The binding mode. 이 속성 값이 변경 됩니다 전파 되는 방향을 지정 하려면 사용 됩니다.This is used to specify the direction in which property value changes will propagate. 기본 바인딩 모드에서는 변경 내용에서 전파 됩니다 합니다 소스대상합니다.In the default binding mode, changes will propagate from the source to the target.
  • 속성 값을 설정 하면 호출 되는 유효성 검사 대리자입니다.A validation delegate that will be invoked when the property value is set. 자세한 내용은 유효성 검사 콜백은합니다.For more information, see Validation Callbacks.
  • 속성이 속성 값을 변경 될 때 호출 될 대리자를 변경 합니다.A property changed delegate that will be invoked when the property value has changed. 자세한 내용은 속성 변경 내용을 감지합니다.For more information, see Detecting Property Changes.
  • 속성 값은 변경 될 때 호출 될 대리자를 변경 하는 속성입니다.A property changing delegate that will be invoked when the property value will change. 이 대리자에 속성 변경 대리자와 동일한 서명이 있습니다.This delegate has the same signature as the property changed delegate.
  • 속성 값을 변경 될 때 호출 되는 강제 값 대리자입니다.A coerce value delegate that will be invoked when the property value has changed. 자세한 내용은 강제 값 콜백을합니다.For more information, see Coerce Value Callbacks.
  • Func 기본 속성 값을 초기화 하는 데 사용 되는 합니다.A Func that's used to initialize a default property value. 자세한 내용은 Func를 사용 하 여 기본 값을 만들기합니다.For more information, see Creating a Default Value with a Func.

접근자 만들기Creating Accessors

속성 접근자 속성 구문을 사용 하 여 바인딩 가능한 속성에 액세스 해야 합니다.Property accessors are required to use property syntax to access a bindable property. Get 접근자는 해당 바인딩 가능한 속성에 포함 된 값을 반환 해야 합니다.The Get accessor should return the value that's contained in the corresponding bindable property. 이 호출 하 여 수행할 수 있습니다 합니다 GetValue 메서드 값을 가져올를 바인딩 가능 속성 식별자에 전달 하 고 다음 결과 필요한 형식으로 캐스팅 합니다.This can be achieved by calling the GetValue method, passing in the bindable property identifier on which to get the value, and then casting the result to the required type. Set 접근자는 해당 바인딩 가능한 속성의 값을 설정 해야 합니다.The Set accessor should set the value of the corresponding bindable property. 이 호출 하 여 수행할 수 있습니다 합니다 SetValue 값 및 설정할 값을 설정 하는 바인딩 가능한 속성 식별자를 전달 하는 메서드.This can be achieved by calling the SetValue method, passing in the bindable property identifier on which to set the value, and the value to set.

다음 코드 예제에서는 대 한 접근자를 EventName 바인딩 가능 속성:The following code example shows accessors for the EventName bindable property:

public string EventName {
  get { return (string)GetValue (EventNameProperty); }
  set { SetValue (EventNameProperty, value); }
}

바인딩 가능한 속성 사용Consuming a Bindable Property

바인딩 가능한 속성을 만든 후에 XAML 또는 코드에서 사용할 수 있습니다.Once a bindable property has been created, it can be consumed from XAML or code. XAML에서 CLR 네임 스페이스 이름 및 필요에 따라 어셈블리 이름이 나타내는 네임 스페이스 선언을 사용 하 여 접두사를 사용 하 여 네임 스페이스를 선언 하 여 작업을 수행 합니다.In XAML, this is achieved by declaring a namespace with a prefix, with the namespace declaration indicating the CLR namespace name, and optionally, an assembly name. 자세한 내용은 XAML 네임 스페이스합니다.For more information, see XAML Namespaces.

다음 코드 예제에서는 사용자 지정 형식을 참조 하는 응용 프로그램 코드와 동일한 어셈블리 내에 정의 된 바인딩 가능한 속성을 포함 하는 사용자 지정 형식에 대 한 XAML 네임 스페이스를 보여 줍니다.The following code example demonstrates a XAML namespace for a custom type that contains a bindable property, which is defined within the same assembly as the application code that's referencing the custom type:

<ContentPage ... xmlns:local="clr-namespace:EventToCommandBehavior" ...>
  ...
</ContentPage>

네임 스페이스 선언을 설정할 때 사용 되는 EventName 다음 XAML 코드 예제에서 설명한 것 처럼 바인딩 가능 속성:The namespace declaration is used when setting the EventName bindable property, as demonstrated in the following XAML code example:

<ListView ...>
  <ListView.Behaviors>
    <local:EventToCommandBehavior EventName="ItemSelected" ... />
  </ListView.Behaviors>
</ListView>

해당하는 C# 코드가 다음 코드 예제에 표시됩니다.The equivalent C# code is shown in the following code example:

var listView = new ListView ();
listView.Behaviors.Add (new EventToCommandBehavior {
  EventName = "ItemSelected",
  ...
});

고급 시나리오Advanced Scenarios

만들 때를 BindableProperty 인스턴스를 바인딩 가능 속성을 고급 시나리오를 사용 하도록 설정할 수 있는 선택적 매개 변수는 여러 가지가 있습니다.When creating a BindableProperty instance, there are a number of optional parameters that can be set to enable advanced bindable property scenarios. 이 섹션에서는 이러한 시나리오를 살펴봅니다.This section explores these scenarios.

속성 변경 내용 감지Detecting Property Changes

A static 속성 변경 콜백 메서드를 지정 하 여 바인딩 가능한 속성을 사용 하 여 등록할 수 있습니다 합니다 propertyChanged 에 대 한 매개 변수를 BindableProperty.Create 메서드.A static property-changed callback method can be registered with a bindable property by specifying the propertyChanged parameter for the BindableProperty.Create method. 지정된 된 콜백 메서드는 바인딩 가능한 속성의 값이 변경 될 때 호출 됩니다.The specified callback method will be invoked when the value of the bindable property changes.

다음 코드 예제에서는 하는 방법을 EventName 바인딩 가능 속성 레지스터는 OnEventNameChanged 속성 변경 콜백 메서드로 메서드:The following code example shows how the EventName bindable property registers the OnEventNameChanged method as a property-changed callback method:

public static readonly BindableProperty EventNameProperty =
  BindableProperty.Create (
    "EventName", typeof(string), typeof(EventToCommandBehavior), null, propertyChanged: OnEventNameChanged);
...

static void OnEventNameChanged (BindableObject bindable, object oldValue, object newValue)
{
  // Property changed implementation goes here
}

속성 변경 콜백 메서드에서 BindableObject 매개 변수는 소유 하는 클래스의 인스턴스를 변경 하 고 두 값을 보고 했습니다 나타내는 데 object 의 이전 및 새 값을 표시 하는 매개 변수 바인딩 가능한 속성입니다.In the property-changed callback method, the BindableObject parameter is used to denote which instance of the owning class has reported a change, and the values of the two object parameters represent the old and new values of the bindable property.

유효성 검사 콜백Validation Callbacks

A static 유효성 검사 콜백 메서드를 지정 하 여 바인딩 가능한 속성을 사용 하 여 등록할 수 있습니다 합니다 validateValue 에 대 한 매개 변수를 BindableProperty.Create 메서드.A static validation callback method can be registered with a bindable property by specifying the validateValue parameter for the BindableProperty.Create method. 바인딩 가능한 속성의 값을 설정 하면 지정된 된 콜백 메서드를 호출 됩니다.The specified callback method will be invoked when the value of the bindable property is set.

다음 코드 예제에서는 하는 방법을 Angle 바인딩 가능 속성 레지스터는 IsValidValue 유효성 검사 콜백 메서드로 메서드:The following code example shows how the Angle bindable property registers the IsValidValue method as a validation callback method:

public static readonly BindableProperty AngleProperty =
  BindableProperty.Create ("Angle", typeof(double), typeof(HomePage), 0.0, validateValue: IsValidValue);
...

static bool IsValidValue (BindableObject view, object value)
{
  double result;
  bool isDouble = double.TryParse (value.ToString (), out result);
  return (result >= 0 && result <= 360);
}

유효성 검사 콜백은 값으로 제공 되 고 반환할지 true 그렇지 않으면 값이 속성에 대 한 유효한 경우 false합니다.Validation callbacks are provided with a value, and should return true if the value is valid for the property, otherwise false. 유효성 검사 콜백을 반환 하는 경우 예외가 발생 false, 개발자가 처리 해야 합니다.An exception will be raised if a validation callback returns false, which should be handled by the developer. 유효성 검사 콜백 메서드의 일반적인 사용 바인딩 가능한 속성을 설정 하면 정수 또는 double 값을 제한 됩니다.A typical use of a validation callback method is constraining the values of integers or doubles when the bindable property is set. 예를 들어 합니다 IsValidValue 메서드는 속성 값이 있는지 확인을 double 범위인 0-360입니다.For example, the IsValidValue method checks that the property value is a double within the range 0 to 360.

강제 값 콜백Coerce Value Callbacks

A static 강제 값 콜백 메서드를 지정 하 여 바인딩 가능한 속성을 사용 하 여 등록할 수 있습니다 합니다 coerceValue 에 대 한 매개 변수를 BindableProperty.Create 메서드.A static coerce value callback method can be registered with a bindable property by specifying the coerceValue parameter for the BindableProperty.Create method. 지정된 된 콜백 메서드는 바인딩 가능한 속성의 값이 변경 될 때 호출 됩니다.The specified callback method will be invoked when the value of the bindable property changes.

강제 값 콜백을 속성의 값이 변경 될 때 바인딩 가능한 속성의 재평가 강제로 실행 하는 데 사용 됩니다.Coerce value callbacks are used to force a reevaluation of a bindable property when the value of the property changes. 예를 들어, 하나의 바인딩 가능한 속성의 값을 다른 바인딩 가능한 속성의 값 보다 크지 않은 되도록 강제 값 콜백을 사용할 수 있습니다.For example, a coerce value callback can be used to ensure that the value of one bindable property is not greater than the value of another bindable property.

다음 코드 예제에서는 하는 방법을 Angle 바인딩 가능 속성 레지스터는 CoerceAngle 강제 값 콜백 메서드로 메서드:The following code example shows how the Angle bindable property registers the CoerceAngle method as a coerce value callback method:

public static readonly BindableProperty AngleProperty = BindableProperty.Create (
  "Angle", typeof(double), typeof(HomePage), 0.0, coerceValue: CoerceAngle);
public static readonly BindableProperty MaximumAngleProperty = BindableProperty.Create (
  "MaximumAngle", typeof(double), typeof(HomePage), 360.0);
...

static object CoerceAngle (BindableObject bindable, object value)
{
  var homePage = bindable as HomePage;
  double input = (double)value;

  if (input > homePage.MaximumAngle) {
    input = homePage.MaximumAngle;
  }

  return input;
}

CoerceAngle 메서드 값을 확인를 MaximumAngle 속성인 경우에 Angle 속성 값이 보다 큰 값으로 강제 변환를 MaximumAngle 속성 값.The CoerceAngle method checks the value of the MaximumAngle property, and if the Angle property value is greater than it, it coerces the value to the MaximumAngle property value.

함수를 사용 하 여 기본값 만들기Creating a Default Value with a Func

Func 다음 코드 예제에서 설명한 것 처럼 바인딩 가능한 속성의 기본 값을 초기화 하기 사용할 수 있습니다.A Func can be used to initialize the default value of a bindable property, as demonstrated in the following code example:

public static readonly BindableProperty SizeProperty =
  BindableProperty.Create ("Size", typeof(double), typeof(HomePage), 0.0,
  defaultValueCreator: bindable => Device.GetNamedSize (NamedSize.Large, (Label)bindable));

defaultValueCreator 매개 변수는 설정를 Func 를 호출 하는 합니다 Device.GetNamedSize 반환 하는 방법을 double 에 사용 되는 글꼴에 대 한 명명 된 크기를 나타내는 Label 네이티브 플랫폼입니다.The defaultValueCreator parameter is set to a Func that invokes the Device.GetNamedSize method to return a double that represents the named size for the font that is used on a Label on the native platform.

요약Summary

이 문서는 바인딩 가능한 속성에 대 한 소개를 제공 하 고 만들고이 사용 하는 방법을 보여 줍니다.This article provided an introduction to bindable properties, and demonstrated how to create and consume them. 바인딩 가능한 속성을 속성의 값 Xamarin.Forms 속성 시스템에서 추적 되는 속성의 특수 형식입니다.A bindable property is a special type of property, where the property's value is tracked by the Xamarin.Forms property system.