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

Получение "<Имя свойствa> уже было зарегистрировано по ошибке" <Control Name> "в WPF

У меня есть пользовательский элемент управления в WPF, который имеет привязку к свойству Dependency. Когда я пытаюсь скомпилировать приложение, я получаю "Имя свойства", уже зарегистрированное по ошибке "ControlName", а дизайнер показывает "Не удается создать экземпляр ошибки" Контроль пользователя ".

Вот что выглядит мой простой элемент управления:

ExampleUserControl.xaml:

<UserControl x:Class="ExampleApp1.ExampleUserControl"
             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:ExampleApp1"
             mc:Ignorable="d" >

    <TextBox Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ExampleUserControl}}, Path=SomeStringValue}" />

</UserControl>

ExampleUserControl.xaml.cs:

public partial class ExampleUserControl : UserControl
{

    public DependencyProperty SomeStringValueProperty = DependencyProperty.Register("SomeStringValue", typeof(string), typeof(ExampleUserControl));
    public string SomeStringValue
    {
        get
        {
            return GetValue(SomeStringValueProperty) as string;
        }
        set
        {
            SetValue(SomeStringValueProperty, value);
        }
    }

    public ExampleUserControl()
    {
        InitializeComponent();
    }
}

Главное окно, в котором он размещался:

<Window x:Class="ExampleApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ExampleApp1"
        Title="MainWindow" Height="350" Width="525">

    <StackPanel>
        <local:ExampleUserControl SomeStringValue="Test 1" />
        <local:ExampleUserControl SomeStringValue="Test 2" />
    </StackPanel>

</Window>

Вот как выглядит дизайнер:

Screenshot of error in designer

Вот что выглядит конструктор XAML: XAML

4b9b3361

Ответ 1

То, что происходит, так это то, что Свойство Зависимости регистрируется несколько раз под одним и тем же именем и владельцем. Свойства зависимости должны иметь одного владельца и должны статически создаваться. Если вы не создаете их статически, будет сделана попытка зарегистрировать их для каждого экземпляра элемента управления.

Сделайте ваше объявление DependencyProperty статическим. Измените его с:

 public DependencyProperty SomeStringValueProperty =
                             DependencyProperty.Register("SomeStringValue", 
                                                         typeof(string), 
                                                         typeof(ExampleUserControl));

To:

public static DependencyProperty SomeStringValueProperty =
                             DependencyProperty.Register("SomeStringValue", 
                                                         typeof(string), 
                                                         typeof(ExampleUserControl));

Ответ 2

Мое сообщение об ошибке этого типа было вызвано регистрацией свойства зависимостей с базовым классом

i.e это

public static readonly DependencyProperty WorkerStateProperty =
    DependencyProperty.Register("WorkerState", typeof(State), typeof(Control),
        new FrameworkPropertyMetadata(State.Stopped, new PropertyChangedCallback(OnWorkerStateChanged)));

вместо этого

public static readonly DependencyProperty WorkerStateProperty =
    DependencyProperty.Register("WorkerState", typeof(State), typeof(WorkerControl),
        new FrameworkPropertyMetadata(State.Stopped, new PropertyChangedCallback(OnWorkerStateChanged)));

где мой класс WorkerControl, полученный из Control

Ответ 3

Я сделал вырезание и вставку между двумя элементами управления для свойства зависимостей и забыл изменить зарегистрированный класс с первого элемента управления на второй. Отсюда дублирование.

 public static readonly DependencyProperty CurrentBatchProperty =
     DependencyProperty.Register(
         "CurrentBatch",
         typeof(Batch),
         typeof({--- Must be same as encompassing class --}), // Error if not set properly.
         new PropertyMetadata(null, OnCurrentBatchPropertyChanged));

Ибо после вставки кода мой оригинальный элемент управления затем регистрировал его в двух разных элементах управления, и он получил волнистую линию (на странице размещения) и ошибку.