using System; using Avalonia; using Avalonia.Controls; using Avalonia.Data; using Avalonia.Interactivity; using Avalonia.Xaml.Interactivity; namespace Artemis.UI.Shared.Behaviors; /// /// Represents a behavior that can be used to make a text box only update it's binding on focus loss. /// public class LostFocusTextBoxBindingBehavior : Behavior { public static readonly StyledProperty TextProperty = AvaloniaProperty.Register( "Text", defaultBindingMode: BindingMode.TwoWay); static LostFocusTextBoxBindingBehavior() { TextProperty.Changed.Subscribe(e => ((LostFocusTextBoxBindingBehavior) e.Sender).OnBindingValueChanged()); } public string Text { get => GetValue(TextProperty); set => SetValue(TextProperty, value); } /// protected override void OnAttached() { if (AssociatedObject != null) AssociatedObject.LostFocus += OnLostFocus; base.OnAttached(); } /// protected override void OnDetaching() { if (AssociatedObject != null) AssociatedObject.LostFocus -= OnLostFocus; base.OnDetaching(); } private void OnLostFocus(object? sender, RoutedEventArgs e) { if (AssociatedObject != null) Text = AssociatedObject.Text; } private void OnBindingValueChanged() { if (AssociatedObject != null) AssociatedObject.Text = Text; } }