diff --git a/demo/Ursa.Demo/ViewModels/DialogDemoViewModel.cs b/demo/Ursa.Demo/ViewModels/DialogDemoViewModel.cs index e96ee23..9fe6f00 100644 --- a/demo/Ursa.Demo/ViewModels/DialogDemoViewModel.cs +++ b/demo/Ursa.Demo/ViewModels/DialogDemoViewModel.cs @@ -25,7 +25,7 @@ public class DialogDemoViewModel: ObservableObject private async Task ShowGlobalDialog() { - await DialogBox.ShowAsync(new BadgeDemoViewModel()); + var result = await DialogBox.ShowAsync(new ButtonGroupDemoViewModel()); } private async Task ShowGlobalOverlayDialog() diff --git a/src/Ursa/Controls/Dialog/DialogBox.cs b/src/Ursa/Controls/Dialog/DialogBox.cs index 980cf57..f92e848 100644 --- a/src/Ursa/Controls/Dialog/DialogBox.cs +++ b/src/Ursa/Controls/Dialog/DialogBox.cs @@ -8,14 +8,12 @@ namespace Ursa.Controls; public static class DialogBox { - public static async Task ShowAsync(TViewModel vm) where TView : Control, new() + public static async Task ShowAsync(TViewModel vm) + where TView : Control, new() { var window = new DialogWindow() { - Content = new TView() - { - DataContext = vm, - }, + Content = new TView(), DataContext = vm, }; var lifetime = Application.Current?.ApplicationLifetime; diff --git a/src/Ursa/Controls/Dialog/DialogWindow.cs b/src/Ursa/Controls/Dialog/DialogWindow.cs index 9ec685e..72ce67c 100644 --- a/src/Ursa/Controls/Dialog/DialogWindow.cs +++ b/src/Ursa/Controls/Dialog/DialogWindow.cs @@ -1,6 +1,7 @@ using Avalonia.Controls; using Avalonia.Controls.Metadata; using Avalonia.Controls.Primitives; +using Avalonia.Interactivity; namespace Ursa.Controls; @@ -13,6 +14,24 @@ public class DialogWindow: Window private Button? _closeButton; + protected override void OnDataContextBeginUpdate() + { + base.OnDataContextBeginUpdate(); + if (DataContext is IDialogContext context) + { + context.Closed-= OnDialogClose; + } + } + + protected override void OnDataContextEndUpdate() + { + base.OnDataContextEndUpdate(); + if (DataContext is IDialogContext context) + { + context.Closed += OnDialogClose; + } + } + protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); @@ -20,11 +39,24 @@ public class DialogWindow: Window if (_closeButton != null) { - _closeButton.Click += (sender, args) => - { - Close(); - }; + _closeButton.Click += OnDefaultClose; + } + } + + private void OnDialogClose(object? sender, object? args) + { + Close(args); + } + + private void OnDefaultClose(object sender, RoutedEventArgs args) + { + if (DataContext is IDialogContext context) + { + Close(context.DefaultCloseResult); + } + else + { + Close(null); } - } } \ No newline at end of file diff --git a/src/Ursa/Controls/Dialog/IDialogContext.cs b/src/Ursa/Controls/Dialog/IDialogContext.cs index ffcaeef..6920f46 100644 --- a/src/Ursa/Controls/Dialog/IDialogContext.cs +++ b/src/Ursa/Controls/Dialog/IDialogContext.cs @@ -2,6 +2,6 @@ namespace Ursa.Controls; public interface IDialogContext { - object Close(); - T? Close(); + object? DefaultCloseResult { get; set; } + event EventHandler Closed; } \ No newline at end of file