FocusSelectedItemBehavior.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. using System;
  2. using System.Reactive.Disposables;
  3. using Avalonia.Controls;
  4. using Avalonia.Controls.Primitives;
  5. using Avalonia.Threading;
  6. namespace Avalonia.Xaml.Interactions.Custom;
  7. /// <summary>
  8. ///
  9. /// </summary>
  10. public class FocusSelectedItemBehavior : AttachedToVisualTreeBehavior<ItemsControl>
  11. {
  12. /// <summary>
  13. ///
  14. /// </summary>
  15. /// <param name="disposable"></param>
  16. protected override void OnAttachedToVisualTree(CompositeDisposable disposable)
  17. {
  18. var dispose = AssociatedObject?
  19. .GetObservable(SelectingItemsControl.SelectedItemProperty)
  20. .Subscribe(selectedItem =>
  21. {
  22. var item = selectedItem;
  23. if (item is not null)
  24. {
  25. Dispatcher.UIThread.Post(() =>
  26. {
  27. var container = AssociatedObject.ContainerFromItem(item);
  28. if (container is not null)
  29. {
  30. container.Focus();
  31. }
  32. });
  33. }
  34. });
  35. if (dispose is not null)
  36. {
  37. disposable.Add(dispose);
  38. }
  39. }
  40. }