72 lines
2.4 KiB
C#
72 lines
2.4 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// Interaction logic for PropertiesView.xaml
|
|
/// </summary>
|
|
public partial class PropertiesView : IViewFor<CodeGenNetworkViewModel>
|
|
{
|
|
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<PropertyDescriptor>? 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);
|
|
}
|
|
}
|
|
}
|