Действительно ли производный словарь требует NewItemTypesAttribute для работы с Xceed CollectionEditor?
Я использую PropertyGrid
контроль (и, соответственно, CollectionEditor
) из расширенной версии WPF Toolkit 3.0 Community Edition. Это делает большую работу большую часть времени, но, кажется, есть небольшая разница в поведении при наличии равнины Dictionary
объявлен в вашем классе по сравнению с использованием пользовательского класса, который расширяет Dictionary
,
Возьмите следующий пример класса:
Public Class TestObject
Public Property MyDictionary As New Dictionary(Of String, String)
End Class
и этот XAML и код, чтобы показать его в PropertyGrid
:
<Window x:Class="MainWindow"
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:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:local="clr-namespace:myApp"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<xctk:PropertyGrid x:Name="myPropertyGrid"/>
</Grid>
</Window>
Public Class MainWindow
Public Sub New()
InitializeComponent()
myPropertyGrid.SelectedObject = New TestObject()
End Sub
End Class
Результат будет выглядеть вот так и все нормально:
Однако, если я сейчас изменю определение с
Public Property MyDictionary As New Dictionary(Of String, String)
в
Public Property MyDictionary As New DerivedDictionary(Of String, String)
где DerivedDictionary
может быть просто объявлен как
Public Class DerivedDictionary(Of TKey, TValue)
Inherits Dictionary(Of TKey, TValue)
End Class
тогда я больше не буду получать EditableKeyValuePair`2
представлены в выпадающем списке CollectionEditor
, но вместо этого просто KeyValuePair`2
, который (как вы уже догадались) не редактируется. Добавление элементов в DerivedDictionary
из-за кода заставит их отображаться как EditableKeyValuePair`2
в редакторе, так что единственная проблема - добавление новых элементов через пользовательский интерфейс.
Я знаю, что могу решить эту проблему, добавив
<NewItemTypes(GetType(EditableKeyValuePair(Of String, String)))>
к декларации MyDictionary
в TestObject
, Но это кажется довольно многословным, если бы я должен был сделать это для каждого случая, когда DerivedDictionary
используется классом, предназначенным для редактирования через пользовательский интерфейс.
Я пропускаю более легкую альтернативу здесь? Может быть, какой-то атрибут, который мне нужно применить к DerivedDictionary
заставить это работать? Или это ошибка / ограничение в текущем PropertyGrid
контроль?