Данные дизайна свойств зависимости - PullRequest
0 голосов
/ 01 мая 2018

У меня есть UserControl, который имеет свойство зависимостей ObservableCollection с обратным вызовом измененного свойства. Обратный вызов перестраивает узлы в элементе управления TreeView. Все это прекрасно работает, но я хотел бы иметь возможность получить данные дизайна. К сожалению, конструктор не вызывает ни конструктор, ни обратный вызов, ни вызов функции значения по умолчанию, если я не встроил свой элемент управления в другой. Есть ли способ загрузки данных по умолчанию в этом сценарии?

Ниже приведен код моего управления

    public partial class ScheduleResourcesSummaryTreeView : UserControl
{
    public ObservableCollection<PerformanceProjection> SelectedPerformances 
    {
        get { return (ObservableCollection<PerformanceProjection>)GetValue(SelectedPerformancesProperty); }
        set { SetValue(SelectedPerformancesProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedPerformancesProperty =
        DependencyProperty.Register("SelectedPerformances", 
            typeof(ObservableCollection<PerformanceProjection>), 
            typeof(ScheduleResourcesSummaryTreeView), 
            new FrameworkPropertyMetadata(
                new ObservableCollection<PerformanceProjection>(),
                FrameworkPropertyMetadataOptions.AffectsRender, SelectedPerformancesChanged)
            );


    private static void SelectedPerformancesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (!(d is ScheduleResourcesSummaryTreeView resourcesTree)) return;
        resourcesTree.ResourcesTree.Items.Clear();
        var sessions = e.NewValue as ObservableCollection<PerformanceProjection> ?? new ObservableCollection<PerformanceProjection>();

        if (sessions.Count == 0) return;
        var projections = sessions.SelectMany(x => x.ResourceBookingProjections);

        TreeNode<ResourceBookingProjection> resourceBookingTreeRoot = new RvtSummaryTree(new ObservableCollection<ResourceBookingProjection>(projections), "");
        foreach (var treeNode in resourceBookingTreeRoot.Children)
        {
            resourcesTree.ResourcesTree.Items.Add((TreeNode<ResourceBookingProjection>)treeNode);
        }
    }

    private static ObservableCollection<PerformanceProjection> DefaultCollection()
    {
        var prop = DesignerProperties.IsInDesignModeProperty;
        var designMode = (bool) DependencyPropertyDescriptor
            .FromProperty(prop, typeof(FrameworkElement))
            .Metadata.DefaultValue;
        if (!designMode)
            return new ObservableCollection<PerformanceProjection>();

        var designdata = new PerformanceProjectionsViewModelDesignData();

        return designdata.SelectedPerformances;

    }

    public ScheduleResourcesSummaryTreeView()
    {
        InitializeComponent();
    }
}
...