Подтвердить что ты не робот

XAML Designer отображает имя свойства вместо данных конструктора (d: DataContext) при привязке

Контекст

Я хочу, чтобы мой UserControl (RepositoryContainer) был заполнен данными, когда на XAML Designer.

Я создал файл с именем RepositoryContainerDesignData.xaml (он находится в той же папке, что и RepositoryContainer.xaml), и установите его как d:DataContext в UserControl.

Но вместо отображения данных, XAML Designer отображает имя свойства.

Здесь минимальный пример:

Данные проектирования (RepositoryContainerDesignData.xaml)

<local:RepositoryContainer xmlns:local="clr-namespace:SystemSpecs.View.UserControls"
                           Title="My Repository Title"
/>

Пользовательский контроль (RepositoryContainer.xaml)

<UserControl x:Class="SystemSpecs.View.UserControls.RepositoryContainer"
                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:SystemSpecs.View.UserControls"
                mc:Ignorable="d" 
                d:DesignHeight="100" d:DesignWidth="500"
                d:DataContext="{d:DesignData Source=RepositoryContainerDesignData.xaml}"
                DataContext="{Binding RelativeSource={RelativeSource Self}}">

    <Grid>
        <TextBlock Text="{Binding Path=Title}" FontSize="24" Foreground="White" HorizontalAlignment="Center" />
    </Grid>
</UserControl>

Code-за

using System.Windows.Controls;

namespace SystemSpecs.View.UserControls
{
    public partial class RepositoryContainer : UserControl
    {
        public string Title { get; set; }

        public RepositoryContainer()
        {
            InitializeComponent();
        }
    }
}

Ожидаемый результат:

Ожидаемый результат

Вывод:

Вывод

Уже пробовал:

Информация о среде:

  • Windows 10 Pro x64
  • Сообщество Visual Studio 2015 (версия 14.9.25431.01 Обновление 3)
  • Microsoft.NET Framework 4.6.01586
  • Дополнительная информация на Pastebin RAW, чтобы сохранить сообщение чистым

Я что-то пропустил?

PS

Если я создаю класс (например, public class RepositoryContainerData), создайте свойство с именем Title и установите экземпляр этого класса как d:DataContext (d:DataContext="{d:DesignInstance local:RepositoryContainerData, IsDesignTimeCreatable=True}"), он работает как ожидалось.

4b9b3361

Ответ 1

Вы должны использовать свойства зависимостей в пользовательских элементах WPF, поскольку они имеют уведомление об изменении.

    public static DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(RepositoryContainer), new FrameworkPropertyMetadata(new PropertyChangedCallback(Title_Changed)));

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


    private static void Title_Changed(DependencyObject o, DependencyPropertyChangedEventArgs args)
    {
        RepositoryContainer thisClass = (RepositoryContainer)o;
        thisClass.SetTitle();
    }

    private void SetTitle()
    {
        //Put Instance Title Property Changed code here
    }

Просто замените свойство Title кодом выше, ничто не должно быть добавлено, чтобы заставить его работать. SetTitle() нужен только код, если вам нужно отреагировать на название, измененное в коде.

У меня есть фрагмент кода С#, который я создал давно, который может легко создавать свойства зависимостей, просто дайте мне знать, если вы этого хотите.

Ответ 2

То, что вы пытаетесь сделать, работает для меня, возможно, с некоторыми незначительными изменениями. Я создал новое приложение под названием WpfApplication2.

RepositoryContainerDesignData.xaml содержит:

<wpfApplication2:RepositoryContainer 
    xmlns:wpfApplication2="clr-namespace:WpfApplication2"
    Title="My repository title">
</wpfApplication2:RepositoryContainer>

Свойства файла:

введите описание изображения здесь

Определение управления

<UserControl x:Class="WpfApplication2.RepositoryContainer"
             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"
             d:DataContext="{d:DesignData Source=RepositoryContainerDesignData.xaml}"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid Background="Bisque">
        <TextBlock Text="{Binding Path=Title}" FontSize="24" 
                   HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</UserControl>

Результат в дизайнере

enter image description here

Не то, что я обычно делал, но я чему-то научился:)