Получение "<Имя свойств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]()
Ответы
Ответ 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));
Ибо после вставки кода мой оригинальный элемент управления затем регистрировал его в двух разных элементах управления, и он получил волнистую линию (на странице размещения) и ошибку.