ConventionBinder now binds IDialogViewModel.Submit to close the associated view

This commit is contained in:
Markus Ewald 2025-07-05 20:17:19 +02:00
parent 364b8919b5
commit e11922ae4f
3 changed files with 73 additions and 5 deletions

View File

@ -21,6 +21,9 @@ using System;
using Avalonia.Controls;
using Nuclex.Avalonia.ViewModels;
using Nuclex.Avalonie.ViewModels;
namespace Nuclex.Avalonia.AutoBinding {
/// <summary>
@ -55,6 +58,27 @@ namespace Nuclex.Avalonia.AutoBinding {
/// <param name="view">View that will be bound</param>
/// <param name="viewModel">View model the view will be bound to</param>
private void bind(Control view, object viewModel) {
IDialogViewModel? dialogViewModel = viewModel as IDialogViewModel;
if(dialogViewModel != null) {
Window? viewAsWindow = view as Window;
if(viewAsWindow != null) {
EventHandler<DialogResultEventArgs> 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;
};
}
}
}
}

View File

@ -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 {
/// <summary>Carries the desired dialog result from a view model</summary>
public class DialogResultEventArgs : EventArgs {
/// <summary>Initializes a new dialog result event argument container</summary>
/// <param name="result">Result the dialog should exit with</param>
public DialogResultEventArgs(object result) {
this.result = result;
}
/// <summary>Result that should be returned from the dialog</summary>
public object Result {
get { return this.result; }
}
/// <summary>Result that should be returned from the dialog</summary>
private readonly object result;
}
} // namespace Nuclex.Avalonia.ViewModels

View File

@ -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 {
/// <summary>Interface for dialog view models (typically modal ones)</summary>
public interface IDialogViewModel {
/// <summary>Indicates that the view should close</summary>
event EventHandler Submitted;
event EventHandler<DialogResultEventArgs> Submitted;
/// <summary>Indicates that the dialog should be closed</summary>
/// <param name="dialogResult">Result the dialog should return</param>
/// <returns>A task that finishes when the submit notification has been sent</returns>
Task SubmitAsync();
Task SubmitAsync(object? dialogResult = null);
}
} // namespace Nuclex.Windows.Forms.ViewModels
} // namespace Nuclex.Avalonie.ViewModels