Действительно ли производный словарь требует 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

Результат будет выглядеть вот так и все нормально: CollectionEditor с EditableKeyValuePair`2


Однако, если я сейчас изменю определение с

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 контроль?

0 ответов

Другие вопросы по тегам