using System; using Avalonia; using Avalonia.VisualTree; using Avalonia.Controls; using ReactiveUI; namespace Avalonia.ReactiveUI { /// /// A ReactiveUI UserControl that implements /// and will activate your ViewModel automatically if it supports activation. /// /// ViewModel type. public class ReactiveUserControl : UserControl, IViewFor where TViewModel : class { public static readonly StyledProperty ViewModelProperty = AvaloniaProperty .Register, TViewModel>(nameof(ViewModel)); /// /// Initializes a new instance of the class. /// public ReactiveUserControl() { this.WhenAnyValue(x => x.DataContext) .Subscribe(context => ViewModel = context as TViewModel); this.WhenAnyValue(x => x.ViewModel) .Subscribe(model => DataContext = model); } /// /// The ViewModel. /// public TViewModel ViewModel { get => GetValue(ViewModelProperty); set => SetValue(ViewModelProperty, value); } object IViewFor.ViewModel { get => ViewModel; set => ViewModel = (TViewModel)value; } } }