WPF Отображение свойств в DesignTime

Здравствуйте.

Делаю свой контрол с кнопкой и заголовком. Прописал свойства как положено и путь для картинки. Но почему то в DesignTime Все поля остаются пустыми … Почему так?? Как это можно побороть то… ведь разработка тогда становится просто ужасной. Как можно определить размеры и параметры компонентов если их не видно. Это баг такой или кривые руки??

    public partial class ButtonHeaderControl : UserControl
    {

        public string Title
        {
            get => (string)GetValue(TitleProperty);
            set => SetValue(TitleProperty, value);
        }

        public string ImageSource
        {
            get => (string)GetValue(ImageSourceProperty);
            set => SetValue(ImageSourceProperty, value);
        }

        public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(ButtonHeaderControl), new FrameworkPropertyMetadata("Header", MyPropertyChanged ));
        public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(string), typeof(ButtonHeaderControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));

        public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("ClickEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonHeaderControl));

        private static void MyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ButtonHeaderControl control = d as ButtonHeaderControl;
            control.Title = e.NewValue.ToString();        }

        public event RoutedEventHandler ClickEventHandler
        {
            add { AddHandler(ClickEvent, value); }
            remove { RemoveHandler(ClickEvent, value); }
        }

        public ButtonHeaderControl()
        {
            Title = "iuoiuoiu";
            InitializeComponent();
            DataContext = this;
        }

        private void OnButtonsClick(object sender, RoutedEventArgs e)
        {
            RaiseEvent(new RoutedEventArgs(ClickEvent, e));
        }
    }

Причем в панели свойств отображает а на форме пустота.

А что в XAML?

Эти значения свойств каким способом указаны?

<UserControl x:Class="MyApp.Controls.ButtonHeaderControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyApp.Controls" d:DataContext="{d:DesignInstance Type=local:ButtonHeaderControl}"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800" >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock Text="{Binding Title}"/>
        <Button Style="{StaticResource ImageButtonStyle}" Grid.Row="1" Click="OnButtonsClick">
            <Image Source="{Binding ImageSource }"/>
        </Button>
    </Grid>
</UserControl>

Оно данные по идее отсюда берет

а там их вроде бы нет.

Можно попробовать создать обычный класс с обычными свойствами с соотв. именами и нужными значениями, и указать его тут.

Так я уже и не ставил контекст.
К тому же local:ButtonHeaderControl это и есть этот же класс.

public partial class ButtonHeaderControl : UserControl
Просто с реализованным интерфейсов

    public partial class ButtonHeaderControl : UserControl, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void NotifyPropertyChanged(string info)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(info));
            }
        }

А можете у себя проверить?? Хотя бы с одним текстовым полем??

Так датаконтекст это по идее просто класс с данными.

Типа такого самое простое:

public class ButtonHeaderControlDataContext
{
    public string Title { get; } = "My title";
}

А тут откуда возьмутся значения? Не уверен что установка значений в инспекторе свойств влияет на тот датаконтекст.

Не понял. Так мне контрол нужен. Чтобы я в дизайне мог задать нужные значения текста

В общем разродилось. ХЗ насколько это правильно и грамотно, но работает.

 public partial class ButtonHeaderControl : UserControl, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void NotifyPropertyChanged(string info)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
        }
        public string Title
        {
            get => (string)GetValue(TitleProperty);
            set
            {
                SetValue(TitleProperty, value);
                NotifyPropertyChanged("Title");
            }
        }


        public ImageSource ImageContent
        {
            get => (ImageSource)GetValue(ImageContentProperty);
            set
            {
                SetValue(ImageContentProperty, value);
                NotifyPropertyChanged("ImageContent");
            }
        }

        public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(ButtonHeaderControl), new FrameworkPropertyMetadata("Header", FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender));
        public static readonly DependencyProperty ImageContentProperty = DependencyProperty.Register("ImageContent", typeof(ImageSource), typeof(ButtonHeaderControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender));
        public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent("ClickEventHandler", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ButtonHeaderControl));

        public event RoutedEventHandler ClickEventHandler
        {
            add { AddHandler(ClickEvent, value); }
            remove { RemoveHandler(ClickEvent, value); }
        }

        public ButtonHeaderControl()
        {
            InitializeComponent(); 

            NotifyPropertyChanged("Title");
            NotifyPropertyChanged("ImageSource");
            NotifyPropertyChanged("ImageContent");
        }

        private void OnButtonsClick(object sender, RoutedEventArgs e)
        {
            RaiseEvent(new RoutedEventArgs(ClickEvent, e));
        }
    }

XAML

    <UserControl.Resources>
        <BitmapImage x:Key="DesignSource" UriSource="/Images/test.png"/>
    </UserControl.Resources>
    
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>        
        <TextBlock Text="{Binding Title, FallbackValue=Title, Mode=TwoWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:ButtonHeaderControl}}"/>
        <Button Style="{StaticResource ImageButtonStyle}" Grid.Row="1" Click="OnButtonsClick">
            <Image Source="{Binding ImageContent, FallbackValue={StaticResource DesignSource}, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:ButtonHeaderControl}}"/>
        </Button>
    </Grid>

DesignTime code

      <controls:ButtonHeaderControl  Title="dddddd" ImageContent="/Images/waiting.gif"/>

image

Если кто знает как правильнее то пишите. Интересно насколько шустро это будет все работать.