0

Как вы можете видеть в приведенном ниже коде, я создал собственный элемент управления с именем Period, который наследуется от Listbox , В нем я объявил свойство зависимостей только для чтения с именем «Субъекты». Когда в окне WPF установлен один период, все работает нормально. Однако, когда я помещаю более одного, я получаю ошибку, упомянутую в названии.Ошибка: «Объект« Объекты »уже был зарегистрирован« Период », когда возникает более одного элемента управления на форме

Вот Период Класс:

Public Class Period 
Inherits System.Windows.Controls.ListBox 

'-------- PROPERTIES --------' 
Public ReadOnly Property Subjects() As ObservableCollection(Of Subject) 
    Get 
     Return Me.GetValue(SubjectsProperty) 
    End Get 
End Property 

Private ReadOnly SubjectsPropertyKey As DependencyPropertyKey = DependencyProperty.RegisterReadOnly("Subjects", GetType(ObservableCollection(Of Subject)), GetType(Period), New FrameworkPropertyMetadata(New ObservableCollection(Of Subject))) 
Public ReadOnly SubjectsProperty As DependencyProperty = SubjectsPropertyKey.DependencyProperty 

'-------- SUBROUTINES ---------' 
Shared Sub New() 
    'This OverrideMetadata call tells the system that this element wants to provide a style that is different than its base class. 
    'This style is defined in themes\generic.xaml 
    DefaultStyleKeyProperty.OverrideMetadata(GetType(Period), New FrameworkPropertyMetadata(GetType(Period))) 
End Sub 

Public Sub New() 
    MyBase.New() 

    Me.SetValue(SubjectsPropertyKey, New ObservableCollection(Of Subject)) 


End Sub 


'-------- METHODS ---------' 
Public Sub AddSubject(ByRef subject As Subject) 
    If Me.CheckForDuplicates(subject) = True Then 
     MsgBox("This subject is already present in this period.") 
    Else 
     Dim SubjectsList As New ObservableCollection(Of Subject) 
     SubjectsList = Me.GetValue(SubjectsProperty) 
     SubjectsList.Add(subject) 

     Me.SetValue(SubjectsPropertyKey, SubjectsList) 
    End If 
End Sub 

Public Sub RemoveSubject(ByRef subject As Subject) 
    If Me.CheckForDuplicates(subject) = False Then 
     MsgBox("This subject is not present in this period.") 
    Else 
     Dim SubjectsList As New ObservableCollection(Of Subject) 
     SubjectsList = Me.GetValue(SubjectsProperty) 
     SubjectsList.Remove(subject) 

     Me.SetValue(SubjectsPropertyKey, SubjectsList) 
    End If 
End Sub 

Public Function CheckForDuplicates(ByRef subject As Subject) As Boolean 
    Dim Conflict As Boolean 

    If Subjects.Contains(subject) Then 
     Conflict = True 
    End If 

    Return Conflict 
End Function 

Private Sub Period_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized 
    Me.ItemsSource = Subjects 
End Sub 
End Class 

Вот код для окна:

<Grid Background="#FF2B2B2B"> 
    <local:Period HorizontalAlignment="Left" VerticalAlignment="Top"/> 
    <local:Period HorizontalAlignment="Left" VerticalAlignment="Top"/> 
</Grid> 
+0

* SubjectsPropertyKey * и * SubjectsProperty * должны быть разделены. – LPL

+0

@LPL Спасибо, это сработало. Не могли бы вы разместить его в качестве ответа, чтобы я мог отметить его как таковой. Благодарю. – Ivel97

ответ

1

SubjectsPropertyKey и SubjectsProperty должен быть Shared. В противном случае он пытается зарегистрировать Тема с каждым экземпляром Период класс, и это не удастся после успешной регистрации.

См. Раздел «Примеры» в разделе MSDN.