Files
Ursa.Avalonia/src/Ursa.ReactiveUIExtension/ReactiveUrsaView.cs
Copilot cd920d8b45 Replace Avalonia.ReactiveUI with ReactiveUI.Avalonia to use newer ReactiveUI version (#795)
* Initial plan

* Replace Avalonia.ReactiveUI with ReactiveUI.Avalonia to use newer ReactiveUI version

Co-authored-by: rabbitism <14807942+rabbitism@users.noreply.github.com>

* Update ReactiveUI.Avalonia version to 11.3.0 as requested

Co-authored-by: rabbitism <14807942+rabbitism@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: rabbitism <14807942+rabbitism@users.noreply.github.com>
2025-10-14 11:29:06 +08:00

63 lines
2.1 KiB
C#

using Avalonia;
using ReactiveUI;
using Ursa.Controls;
/* These codes are ported from ReactiveUI.Avalonia.
* **/
namespace Ursa.ReactiveUIExtension;
/// <summary>
/// A ReactiveUI <see cref="UrsaView"/> that implements the <see cref="IViewFor{TViewModel}"/> interface and
/// will activate your ViewModel automatically if the view model implements <see cref="IActivatableViewModel"/>.
/// When the DataContext property changes, this class will update the ViewModel property with the new DataContext
/// value, and vice versa.
/// </summary>
/// <typeparam name="TViewModel">ViewModel type.</typeparam>
public class ReactiveUrsaView<TViewModel> : UrsaView, IViewFor<TViewModel> where TViewModel : class
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("AvaloniaProperty", "AVP1002", Justification = "Generic avalonia property is expected here.")]
public static readonly StyledProperty<TViewModel?> ViewModelProperty = AvaloniaProperty
.Register<ReactiveUrsaView<TViewModel>, TViewModel?>(nameof(ViewModel));
/// <summary>
/// Initializes a new instance of the <see cref="ReactiveUrsaView{TViewModel}"/> class.
/// </summary>
public ReactiveUrsaView()
{
// This WhenActivated block calls ViewModel's WhenActivated
// block if the ViewModel implements IActivatableViewModel.
this.WhenActivated(disposables => { });
}
/// <summary>
/// The ViewModel.
/// </summary>
public TViewModel? ViewModel
{
get => GetValue(ViewModelProperty);
set => SetValue(ViewModelProperty, value);
}
object? IViewFor.ViewModel
{
get => ViewModel;
set => ViewModel = (TViewModel?)value;
}
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
base.OnPropertyChanged(change);
if (change.Property == DataContextProperty) {
if (ReferenceEquals(change.OldValue, ViewModel)
&& change.NewValue is null or TViewModel) {
SetCurrentValue(ViewModelProperty, change.NewValue);
}
}
else if (change.Property == ViewModelProperty) {
if (ReferenceEquals(change.OldValue, DataContext)) {
SetCurrentValue(DataContextProperty, change.NewValue);
}
}
}
}