using System; using System.ComponentModel; using System.Linq; using System.Reactive.Disposables; using System.Reactive.Linq; using System.Windows; using DynamicData; using Intromat.ViewModels; using ReactiveUI; using Xceed.Wpf.Toolkit.PropertyGrid; namespace Intromat.Views { /// /// Interaction logic for PropertiesView.xaml /// public partial class PropertiesView : IViewFor { public static readonly DependencyProperty ViewModelProperty = DependencyProperty.Register(nameof(ViewModel), typeof(CodeGenNetworkViewModel), typeof(PropertiesView), new PropertyMetadata(null)); public PropertiesView() { InitializeComponent(); this.WhenActivated(d => { this.WhenAnyValue(v => v.ViewModel!.SelectedObject!.PropertyDescriptors) .Where(l => l != null) .Select(l => l!.Connect()) .Switch() .Subscribe(_ => PropertyGrid.PropertyDefinitions = CreatePropertyDefinitions(ViewModel!.SelectedObject!.PropertyDescriptors)) .DisposeWith(d); this.OneWayBind(ViewModel, vm => vm.SelectedObject, v => v.PropertyGrid.SelectedObject).DisposeWith(d); }); } private PropertyDefinitionCollection CreatePropertyDefinitions(IObservableList? propertyDescriptors) { var result = new PropertyDefinitionCollection(); if (propertyDescriptors != null) result.AddRange(propertyDescriptors.Items.Select(PropertySelector)); return result; } private PropertyDefinition PropertySelector(PropertyDescriptor descriptor) { return new() { Category = descriptor.Category, Description = descriptor.Description, IsBrowsable = descriptor.IsBrowsable, DisplayName = descriptor.DisplayName, TargetProperties = new [] { descriptor.Name } }; } object? IViewFor.ViewModel { get => ViewModel; set => ViewModel = (CodeGenNetworkViewModel?)value; } public CodeGenNetworkViewModel? ViewModel { get => (CodeGenNetworkViewModel?)GetValue(ViewModelProperty); set => SetValue(ViewModelProperty, value); } } }