diff --git a/Toolkit.Avalonia/ContentControlHandler.cs b/Toolkit.Avalonia/ContentControlHandler.cs index 6a2aa0c..b14046f 100644 --- a/Toolkit.Avalonia/ContentControlHandler.cs +++ b/Toolkit.Avalonia/ContentControlHandler.cs @@ -21,7 +21,7 @@ public class ContentControlHandler : { if (content is IActivated activated) { - await activated.Activated(); + await activated.OnActivated(); } } @@ -35,7 +35,7 @@ public class ContentControlHandler : { if (content is IDeactivated deactivated) { - await deactivated.Deactivated(); + await deactivated.OnDeactivated(); } if (content is IDisposable disposable) diff --git a/Toolkit.Avalonia/ContentDialogHandler.cs b/Toolkit.Avalonia/ContentDialogHandler.cs index 1c34ade..8eafbb2 100644 --- a/Toolkit.Avalonia/ContentDialogHandler.cs +++ b/Toolkit.Avalonia/ContentDialogHandler.cs @@ -81,7 +81,7 @@ public class ContentDialogHandler(IDispatcher dispatcher) : { if (content is IDeactivating deactivating) { - await deactivating.Deactivating(); + await deactivating.OnDeactivating(); } } } @@ -96,7 +96,7 @@ public class ContentDialogHandler(IDispatcher dispatcher) : { if (content is IActivated activated) { - await activated.Activated(); + await activated.OnActivated(); } } } @@ -109,7 +109,7 @@ public class ContentDialogHandler(IDispatcher dispatcher) : { if (content is IDeactivated deactivated) { - await deactivated.Deactivated(); + await deactivated.OnDeactivated(); } } } diff --git a/Toolkit.Avalonia/ContentTemplate.cs b/Toolkit.Avalonia/ContentTemplate.cs index 2c1d692..cae6f8b 100644 --- a/Toolkit.Avalonia/ContentTemplate.cs +++ b/Toolkit.Avalonia/ContentTemplate.cs @@ -29,7 +29,7 @@ public class ContentTemplate : { if (content is IActivated activated) { - await activated.Activated(); + await activated.OnActivated(); } } } @@ -40,7 +40,7 @@ public class ContentTemplate : { if (content is IActivated activated) { - await activated.Activated(); + await activated.OnActivated(); } } } @@ -52,7 +52,7 @@ public class ContentTemplate : { if (content is IDeactivated deactivated) { - await deactivated.Deactivated(); + await deactivated.OnDeactivated(); } } } diff --git a/Toolkit.Avalonia/FrameHandler.cs b/Toolkit.Avalonia/FrameHandler.cs index 9a42b1f..fa6c809 100644 --- a/Toolkit.Avalonia/FrameHandler.cs +++ b/Toolkit.Avalonia/FrameHandler.cs @@ -37,7 +37,7 @@ public class FrameHandler : { if (content is IDeactivated deactivated) { - await deactivated.Deactivated(); + await deactivated.OnDeactivated(); } if (content is not IKeepAlive) @@ -63,7 +63,7 @@ public class FrameHandler : { if (content is IDeactivating deactivating) { - await deactivating.Deactivating(); + await deactivating.OnDeactivating(); } } } @@ -74,7 +74,7 @@ public class FrameHandler : { if (content is IActivated activated) { - await activated.Activated(); + await activated.OnActivated(); } } @@ -89,7 +89,7 @@ public class FrameHandler : { if (content is IDeactivated deactivated) { - await deactivated.Deactivated(); + await deactivated.OnDeactivated(); } if (content is IDisposable disposable) diff --git a/Toolkit.Foundation/ComponentConfigurationViewModel.cs b/Toolkit.Foundation/ComponentConfigurationViewModel.cs index 856456f..45ac4f9 100644 --- a/Toolkit.Foundation/ComponentConfigurationViewModel.cs +++ b/Toolkit.Foundation/ComponentConfigurationViewModel.cs @@ -51,10 +51,10 @@ public partial class ComponentConfigurationViewModel args) @@ -93,10 +93,10 @@ public partial class ComponentConfigurationViewModel args) diff --git a/Toolkit.Foundation/IActivated.cs b/Toolkit.Foundation/IActivated.cs index 33d75d5..d335a1e 100644 --- a/Toolkit.Foundation/IActivated.cs +++ b/Toolkit.Foundation/IActivated.cs @@ -2,5 +2,5 @@ public interface IActivated { - Task Activated(); + Task OnActivated(); } \ No newline at end of file diff --git a/Toolkit.Foundation/IDeactivated.cs b/Toolkit.Foundation/IDeactivated.cs index f640164..84bbeb4 100644 --- a/Toolkit.Foundation/IDeactivated.cs +++ b/Toolkit.Foundation/IDeactivated.cs @@ -2,5 +2,5 @@ public interface IDeactivated { - Task Deactivated(); + Task OnDeactivated(); } \ No newline at end of file diff --git a/Toolkit.Foundation/IDeactivating.cs b/Toolkit.Foundation/IDeactivating.cs index 6a70c8a..4b58970 100644 --- a/Toolkit.Foundation/IDeactivating.cs +++ b/Toolkit.Foundation/IDeactivating.cs @@ -2,5 +2,5 @@ public interface IDeactivating { - Task Deactivating(); + Task OnDeactivating(); } \ No newline at end of file diff --git a/Toolkit.Foundation/Observable.cs b/Toolkit.Foundation/Observable.cs index 317148d..38ee961 100644 --- a/Toolkit.Foundation/Observable.cs +++ b/Toolkit.Foundation/Observable.cs @@ -24,6 +24,9 @@ public partial class Observable(IServiceProvider provider, { private readonly Dictionary trackedProperties = []; + [ObservableProperty] + private bool isActivated; + [ObservableProperty] private bool isActive; @@ -42,6 +45,12 @@ public partial class Observable(IServiceProvider provider, public ISubscriber Subscriber { get; } = subscriber; + public virtual Task OnActivated() + { + IsActivated = true; + return Task.CompletedTask; + } + public void Commit() { foreach (object trackedProperty in trackedProperties.Values) @@ -50,6 +59,15 @@ public partial class Observable(IServiceProvider provider, } } + public virtual Task OnDeactivated() + { + IsActivated = false; + return Task.CompletedTask; + } + + public virtual Task OnDeactivating() => + Task.CompletedTask; + public virtual void Dispose() { GC.SuppressFinalize(this); @@ -67,25 +85,6 @@ public partial class Observable(IServiceProvider provider, Subscriber.Subscribe(this); } - [ObservableProperty] - private bool isActivated; - - public virtual Task Activated() - { - IsActivated = true; - return Task.CompletedTask; - } - - - public virtual Task Deactivated() - { - IsActivated = false; - return Task.CompletedTask; - } - - public virtual Task Deactivating() => - Task.CompletedTask; - public void Revert() { foreach (object trackedProperty in trackedProperties.Values) diff --git a/Toolkit.Foundation/ObservableCollection.cs b/Toolkit.Foundation/ObservableCollection.cs index e71afee..aadb608 100644 --- a/Toolkit.Foundation/ObservableCollection.cs +++ b/Toolkit.Foundation/ObservableCollection.cs @@ -127,7 +127,7 @@ public partial class ObservableCollection : object? IList.this[int index] { - get => collection[index]; + get => index >= 0 ? collection[index] : null; set { TItem? item = default; @@ -144,7 +144,7 @@ public partial class ObservableCollection : } } - public virtual Task Activated() + public virtual Task OnActivated() { IsActivated = true; while (pendingEvents.Count > 0) @@ -251,13 +251,13 @@ public partial class ObservableCollection : void ICollection.CopyTo(Array array, int index) => collection.CopyTo((TItem[])array, index); - public virtual Task Deactivated() + public virtual Task OnDeactivated() { IsActivated = false; return Task.CompletedTask; } - public virtual Task Deactivating() => + public virtual Task OnDeactivating() => Task.CompletedTask; public virtual void Dispose() @@ -642,11 +642,15 @@ public partial class ObservableCollection : } } } + partial void OnSelectedItemChanged(TItem? oldValue, TItem? newValue) { if (oldValue is ISelectable oldSelection) { - oldSelection.IsSelected = false; + if (oldSelection.IsSelected) + { + oldSelection.IsSelected = false; + } } if (newValue is ISelectable newSelection) diff --git a/Toolkit.UI.Avalonia/ConditionalExpression.cs b/Toolkit.UI.Avalonia/ConditionalExpression.cs index 14c35ab..da7223e 100644 --- a/Toolkit.UI.Avalonia/ConditionalExpression.cs +++ b/Toolkit.UI.Avalonia/ConditionalExpression.cs @@ -1,8 +1,28 @@ using Avalonia; +using Avalonia.Data.Converters; +using Avalonia.Markup.Xaml; using Avalonia.Metadata; +using System.Globalization; namespace Toolkit.UI.Avalonia; +public class NamedTypeConverter : + MarkupExtension, + IValueConverter +{ + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + var d = value is not null ? value.GetType().Name : (object?)null; + return d; + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + + public override object ProvideValue(IServiceProvider serviceProvider) => this; +} public class ConditionalExpression : AvaloniaObject, ICondition diff --git a/Toolkit.UI.Avalonia/InvokeNavigationViewItemAction.cs b/Toolkit.UI.Avalonia/InvokeNavigationViewItemAction.cs index 7c81a73..8e40daf 100644 --- a/Toolkit.UI.Avalonia/InvokeNavigationViewItemAction.cs +++ b/Toolkit.UI.Avalonia/InvokeNavigationViewItemAction.cs @@ -14,6 +14,15 @@ public class InvokeNavigationViewItemAction : public static readonly StyledProperty SelectedIndexProperty = AvaloniaProperty.Register(nameof(SelectedIndex), 0); + public static readonly StyledProperty TargetProperty = + AvaloniaProperty.Register(nameof(Target)); + + public object Target + { + get => GetValue(TargetProperty); + set => SetValue(TargetProperty, value); + } + public int SelectedIndex { get => GetValue(SelectedIndexProperty); @@ -22,7 +31,7 @@ public class InvokeNavigationViewItemAction : public object? Execute(object? sender, object? parameter) { - if (sender is NavigationViewItem navigationViewItem) + if ((Target ?? sender) is NavigationViewItem navigationViewItem) { Dispatcher.UIThread.Post(() => { @@ -36,7 +45,7 @@ public class InvokeNavigationViewItemAction : }, DispatcherPriority.ContextIdle); } - if (sender is NavigationView navigationView) + if ((Target ?? sender) is NavigationView navigationView) { Dispatcher.UIThread.Invoke(() => { @@ -44,13 +53,12 @@ public class InvokeNavigationViewItemAction : { if (collection is { Count: > 0 }) { - if (collection[SelectedIndex] is ISelectable selectable) - { - selectable.IsSelected = true; - } - navigationView.SetValue(NavigationView.SelectedItemProperty, collection[SelectedIndex]); } + else + { + navigationView.SetValue(NavigationView.SelectedItemProperty, null); + } } }, DispatcherPriority.ContextIdle); } diff --git a/Toolkit.UI.Avalonia/NavigationViewItemExtension.cs b/Toolkit.UI.Avalonia/NavigationViewExtension.cs similarity index 99% rename from Toolkit.UI.Avalonia/NavigationViewItemExtension.cs rename to Toolkit.UI.Avalonia/NavigationViewExtension.cs index 8e8c452..7ceaba2 100644 --- a/Toolkit.UI.Avalonia/NavigationViewItemExtension.cs +++ b/Toolkit.UI.Avalonia/NavigationViewExtension.cs @@ -34,7 +34,7 @@ public class NavigationViewExtension sender.RaiseEvent(new ItemInvokedEventArgs { RoutedEvent = ItemInvokedEvent }); } } - + navigationView.ItemInvoked += OnItemInvoked; return true; }