Behavior'lar

July 15, 2026 · View on GitHub

Behavior'lar, kontrollere alt sınıf oluşturmadan yeniden kullanılabilir işlevsellik ekler. FmgLib.MauiMarkup onları her VisualElement'te bulunan Behaviors(...) metoduyla fluent olarak bağlar.

Behavior Bağlama

new Entry()
    .Text("Click Item")
    .Behaviors(new YourCustomBehavior());

Tek çağrıda birden çok behavior:

new Entry()
    .Placeholder("E-posta")
    .Behaviors(
        new EmailValidationBehavior(),
        new MaxLengthBehavior(64)
    );

Özel Behavior Yazma

Bir behavior Behavior<T>'den türer ve bağlanma/ayrılma kancalarını override eder:

public class NumericValidationBehavior : Behavior<Entry>
{
    protected override void OnAttachedTo(Entry entry)
    {
        entry.TextChanged += OnTextChanged;
        base.OnAttachedTo(entry);
    }

    protected override void OnDetachingFrom(Entry entry)
    {
        entry.TextChanged -= OnTextChanged;
        base.OnDetachingFrom(entry);
    }

    private void OnTextChanged(object? sender, TextChangedEventArgs e)
    {
        bool isValid = double.TryParse(e.NewTextValue, out _);
        ((Entry)sender!).TextColor = isValid ? Colors.Black : Colors.Red;
    }
}

Kullanım:

new Entry()
    .Placeholder("Tutar")
    .Keyboard(Keyboard.Numeric)
    .Behaviors(new NumericValidationBehavior());

Bindable Yapılandırmalı Behavior

Behavior'lar BindableObject olduğundan bindable özellikler sunabilirler — ve source generator herhangi bir BindableObject için fluent metot üretebildiğinden, behavior'ınıza kendi fluent API'sini bile verebilirsiniz:

public class MinLengthBehavior : Behavior<Entry>
{
    public static readonly BindableProperty MinLengthProperty =
        BindableProperty.Create(nameof(MinLength), typeof(int), typeof(MinLengthBehavior), 6);

    public int MinLength
    {
        get => (int)GetValue(MinLengthProperty);
        set => SetValue(MinLengthProperty, value);
    }

    protected override void OnAttachedTo(Entry entry) =>
        entry.TextChanged += (s, e) =>
            entry.BackgroundColor = (e.NewTextValue?.Length ?? 0) >= MinLength
                ? Colors.Transparent
                : Colors.MistyRose;
}

// behavior'ı fluent üretimine dahil edin:
[MauiMarkup(typeof(MinLengthBehavior))]
public class MarkupTargets { }

// sonra:
new Entry()
    .Behaviors(new MinLengthBehavior().MinLength(8));

Community Toolkit Behavior'ları

CommunityToolkit.Maui birçok hazır behavior içerir; aynı şekilde bağlanırlar:

new Entry()
    .Placeholder("E-posta")
    .Behaviors(
        new CommunityToolkit.Maui.Behaviors.EmailValidationBehavior
        {
            InvalidStyle = invalidStyle,
            ValidStyle = validStyle
        }
    );

(Toolkit behavior'ları için de fluent metot isterseniz [MauiMarkup(typeof(EmailValidationBehavior))] ile kaydedin — bkz. Üçüncü Parti Kontroller.)

Behavior mu, Alternatifler mi?

İhtiyaçEn iyi araç
Yeniden kullanılabilir, kendi kendine yeten kontrol mantığı (doğrulama, maskeleme, throttling)Behavior
Tek kontrolde tek seferlik olay tepkisiOn<Event> lambda
Koşula bağlı bildirimsel özellik değişimiTrigger'lar
Kontrol durumlarına görsel tepki (odak, devre dışı…)Visual State'ler

Hot Reload Notu

Behavior'lar Build() içinde yaratılan kontrollere bağlanır; hot reload'da kontroller yeniden kurulur ve behavior'lar doğal olarak yeniden bağlanır. Behavior'ları durumsuz tutun veya durumu OnAttachedTo'da sıfırlayın ki yeniden kurulumlar güvenli kalsın.

İlgili Konular