diff --git a/Source/AutoBinding/ConventionBinder.cs b/Source/AutoBinding/ConventionBinder.cs index ff3840f..96364a0 100644 --- a/Source/AutoBinding/ConventionBinder.cs +++ b/Source/AutoBinding/ConventionBinder.cs @@ -21,6 +21,9 @@ using System; using Avalonia.Controls; +using Nuclex.Avalonia.ViewModels; +using Nuclex.Avalonie.ViewModels; + namespace Nuclex.Avalonia.AutoBinding { /// @@ -55,6 +58,27 @@ namespace Nuclex.Avalonia.AutoBinding { /// View that will be bound /// View model the view will be bound to private void bind(Control view, object viewModel) { + IDialogViewModel? dialogViewModel = viewModel as IDialogViewModel; + if(dialogViewModel != null) { + Window? viewAsWindow = view as Window; + if(viewAsWindow != null) { + EventHandler handler = ( + delegate(object sender, DialogResultEventArgs arguments) { + viewAsWindow.Close(arguments.Result); + } + ); + + dialogViewModel.Submitted += handler; + + // Does this help anything? + // Without it, the view has a reference to the view model (via DataContext), + // and the view model references the view (via event subscription), but this + // shouldn't bother the .NET garbage collector at all. + viewAsWindow.Closed += delegate(object sender, EventArgs arguments) { + dialogViewModel.Submitted -= handler; + }; + } + } } } diff --git a/Source/ViewModels/DialogResultEventArgs.cs b/Source/ViewModels/DialogResultEventArgs.cs new file mode 100644 index 0000000..3ad3581 --- /dev/null +++ b/Source/ViewModels/DialogResultEventArgs.cs @@ -0,0 +1,43 @@ +#region Apache License 2.0 +/* +Nuclex Foundation libraries for .NET +Copyright (C) 2002-2025 Markus Ewald / Nuclex Development Labs + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +#endregion // Apache License 2.0 + +using System; + +namespace Nuclex.Avalonia.ViewModels { + + /// Carries the desired dialog result from a view model + public class DialogResultEventArgs : EventArgs { + + /// Initializes a new dialog result event argument container + /// Result the dialog should exit with + public DialogResultEventArgs(object result) { + this.result = result; + } + + /// Result that should be returned from the dialog + public object Result { + get { return this.result; } + } + + /// Result that should be returned from the dialog + private readonly object result; + + } + +} // namespace Nuclex.Avalonia.ViewModels diff --git a/Source/ViewModels/IDialogViewModel.cs b/Source/ViewModels/IDialogViewModel.cs index 90f7714..4ec0690 100644 --- a/Source/ViewModels/IDialogViewModel.cs +++ b/Source/ViewModels/IDialogViewModel.cs @@ -20,20 +20,21 @@ limitations under the License. using System; using System.Threading.Tasks; -using Nuclex.Support; +using Nuclex.Avalonia.ViewModels; -namespace Nuclex.Windows.Forms.ViewModels { +namespace Nuclex.Avalonie.ViewModels { /// Interface for dialog view models (typically modal ones) public interface IDialogViewModel { /// Indicates that the view should close - event EventHandler Submitted; + event EventHandler Submitted; /// Indicates that the dialog should be closed + /// Result the dialog should return /// A task that finishes when the submit notification has been sent - Task SubmitAsync(); + Task SubmitAsync(object? dialogResult = null); } -} // namespace Nuclex.Windows.Forms.ViewModels +} // namespace Nuclex.Avalonie.ViewModels