Share via


BindableObject 확장

확장은 BindableObject 에 대한 구성 Binding을 지원하는 일련의 확장 메서드를 BindableObject제공합니다.

확장은 다음 메서드를 제공합니다.

바인딩

이 메서드는 Bind 설정과 관련된 다양한 편의를 제공하는 여러 오버로드를 Binding제공합니다. .NET MAUI 애플리케이션의 Binding 데이터 가능성에 대한 자세한 내용은 Microsoft 설명서를 참조 하세요.

예시

메서드에 대한 오버로드가 많이 있습니다 Bind .

단방향 바인딩

뷰 모델(RegistrationViewModel) 속성에서 속성으로 호출 RegistrationCode 되는 Text 단방향 바인딩은 Label 다음과 같이 만들 수 있습니다.

new Entry()
    .Bind(Label.TextProperty, 
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode)

양방향 바인딩

뷰 모델(RegistrationViewModel) 속성에서 속성으로 호출 RegistrationCode 되는 Text 양방향 바인딩은 Entry 다음과 같이 만들 수 있습니다.

new Entry()
    .Bind(Entry.TextProperty,
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
            setter: static (RegistrationViewModel vm, string code) => vm.RegistrationCode = code)

복합(중첩) 바인딩

속성 내의 속성("중첩된 바인딩" handlers )에 바인딩하는 경우 매개 변수가 필요합니다. 매개 변수에는 handler 복합 바인딩 체인의 각 속성에 대한 참조가 필요합니다.

아래 예제와 함께 단위 테스트에서 복합 바인딩의 추가 예제를 찾을 수 있습니다 CommunityToolkit.Maui.Markup.

복합(중첩) 바인딩 예제

아래 ViewModel 클래스를 사용하여 매개 변수를 사용하는 데 직접 중첩된 양방향 바인딩을 ViewModel.NestedObject.Texthandlers 만들 수 있습니다.

new Entry().Bind(
    Entry.TextProperty,
    getter: static (ViewModel vm) => vm.NestedObject.Text,
    handlers: new (Func<ViewModel, object?>, string)[]
             {
                (vm => vm, nameof(ViewModel.NestedObject)),
                (vm => vm.NestedObject, nameof(ViewModel.NestedObject.Text)),
             },
    setter: static (ViewModel vm, string text) => vm.NestedObject.Text = text);
class ViewModel
{
    public NestedObject NestedObject { get; set; } = new();

    public required string Text { get; set; }
}

class NestedObject
{
    public required string Text { get; set; }
}

기본 속성

바인딩을 설정할 속성을 지정하지 않고 메서드 Bind 를 호출할 수 있습니다. 그러면 GitHub 리포지토리의 전체 목록과 함께 라이브러리에서 제공하는 기본값을 활용합니다.

바인딩 Entry 할 기본 속성은 텍스트 속성입니다. 따라서 위의 예제를 다음과 같이 작성할 수 있습니다.

new Entry().Bind(nameof(ViewModel.RegistrationCode))

Warning

이 방법을 사용하면 일부 수준의 리플렉션이 사용되고 명시적 속성 접근 방식뿐만 아니라 수행되지 않습니다.

값 변환

Bind 메서드를 사용하면 개발자가 바인딩에서 사용하려는 항목을 제공 Converter 하거나 단순히 인라인 변환을 사용하는 메커니즘을 제공할 수 있습니다.

변환기
new Entry()
    .Bind(Entry.TextProperty,
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
            converter: new TextCaseConverter { Type = TextCaseType.Upper });

전체 사용량에 대한 설명서는 참조 TextCaseConverter 하세요.

인라인 변환
new Entry()
    .Bind(Entry.TextProperty,
            getter: static (RegistrationViewModel vm) => vm.RegistrationCode,
            convert: (string? text) => text?.ToUpperInvariant());

여러 바인딩

를 활용하여 IMultiValueConverter여러 바인딩을 함께 집계할 수 있습니다.

convert 매개 변수는 Func 여러 바인딩을 필요한 결과로 변환하는 데 필요한 매개 변수입니다.

new Label()
    .Bind(Label.TextProperty,
            binding1: new Binding(nameof(ViewModel.IsBusy)),
            binding2: new Binding(nameof(ViewModel.LabelText)),
            convert: ((bool IsBusy, string LabelText) values) => values.IsBusy ? string.Empty : values.LabelText)

BindCommand

이 메서드는 BindCommand GitHub 리포지토리의 전체 목록을 사용하여 라이브러리에서 제공하는 기본값으로 바인딩을 구성하는 유용한 방법을 제공합니다.

바인딩 Button 할 기본 명령은 속성입니다 Command . 따라서 다음 예제에서는 해당 속성에 대한 바인딩을 설정합니다.

new Button().BindCommand(static (ViewModel vm) => vm.SubmitCommand);

위의 내용은 다음과 같이 작성할 수도 있습니다.

참고 항목

기본 명령으로 인해 원하는 명령에 바인딩되지 않는 경우 이 메서드를 Bind 사용할 수 있습니다.

new Button()
    .Bind(Entry.CommandProperty,
            getter: static (RegistrationViewModel vm) => vm.SubmitCommand,
            mode: BindingMode.OneTime);

제스처 바인딩

제스처 바인딩을 사용하면 ViewModel에서 ClickGestureRecognizer구현하고 바인딩 ICommand 하는 모든 요소 IGestureRecognizer 에 연결하여 만듭니SwipeGestureRecognizerTapGestureRecognizer다.

BindClickGesture

다음 예제에서는 ViewModel에서 ClickGestureRecognizer2 클릭을 활성화하고, 연결 Label 하고, ClickCommand라는 속성에 바인딩해야 하는 ICommand 항목을 만드는 방법을 보여 줍니다.

new Label()
    .BindClickGesture(
        static (ViewModel vm) => vm.ClickCommand,
        commandBindingMode: BindingMode.OneTime,
        numberOfClicksRequired: 2));

BindSwipeGesture

다음 예제에서는 해당 거리와 소수점 200포인트 거리에 Threshold필요한 SwipeDirectionSwipeDirection.Up 항목을 만든 SwipeGestureRecognizer 다음, 해당 거리를 A Label 에 연결하고 ViewModel에서 SwipeCommand라는 속성에 바인딩하는 ICommand 방법을 보여 줍니다.

new Label()
    .BindSwipeGesture(
        static (ViewModel vm) => vm.SwipeCommand,
        commandBindingMode: BindingMode.OneTime,
        direction: SwipeDirection.Up,
        threshold: 200);

BindTapGesture

다음 예제에서는 ViewModel에서 탭을 활성화하고, 연결 Label 하고, TapCommand라는 속성에 바인딩해야 하는 ICommand 탭을 만드는 ClickGestureRecognizer2 방법을 보여 줍니다.

new Label()
    .BindTapGesture(
        static (ViewModel vm) => vm.TapCommand,
        commandBindingMode: BindingMode.OneTime,
        numberOfTapsRequired: 2));

AppThemeBinding

AppThemeBinding 메서드를 사용하면 애플리케이션 AppTheme 이 수정될 때 해당 테마에 BindableProperty 적절한 값이 사용되도록 밝고 어두운 값을 할당할 수 있습니다.

다음 예제에서는 애플리케이션이 밝은 테마에서 실행되는 경우 컨트롤의 Label 속성에 검은색 Text 을 할당하고 어두운 테마에서는 흰색을 할당합니다.

new Label().AppThemeBinding(Label.TextColorProperty, Colors.Black, Colors.White);

참고 항목

속성을 처리할 때 더 구체적인 메서드가 Color 있습니다. AppThemeColorBinding 는 동일한 기본 동작 AppThemeBinding 을 수행하지만 매개 변수 집합 Color 이 필요합니다.

자세한 내용은 테마 설명서를 참조하세요.

예제

.NET MAUI 커뮤니티 도구 키트 샘플 애플리케이션 전체에서 이러한 확장 메서드가 작동하는 예제를 찾을 수 있습니다.

API

확장 메서드에 대한 소스 코드는 BindableObject .NET MAUI 커뮤니티 도구 키트 GitHub 리포지토리에서 찾을 수 있습니다.