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);
}
}
}