Расширенный набор инструментов WPF PropertyGrid PasswordEditor

В настоящее время я разрабатываю приложение WPF, которое использует PropertyGrid из библиотеки Extended WPF Toolkit. .

Чтобы отображать имена и описания в поместье, не зависящем от языка, я использую класс-оболочку, который содержит необходимые атрибуты в соответствии с предоставленной документацией. Здесь сокращенный список

[LocalizedDisplayName("ServerConfig", typeof(Resources.Strings.Resources))]
public class ServerConfigPropertyGrid
{
    #region fields
    private ServerConfig serverConfig;
    #endregion

    #region properties
    [LocalizedCategory("VeinStoreCategory", typeof(Resources.Strings.Resources))]
    [LocalizedDisplayName("ActiveDirectoryPasswordDisplayName", typeof(Resources.Strings.Resources))]
    [LocalizedDescription("ActiveDirectoryPasswordDescription", typeof(Resources.Strings.Resources))]
    [Editor(typeof(PasswordEditor), typeof(PasswordEditor))]
    public string LdapPassword
    {
        get { return serverConfig.LdapPassword; }
        set { serverConfig.LdapPassword = value; }
    }
    #endregion

    #region constructor
    public ServerConfigPropertyGrid(ServerConfig serverConfig)
    {
        // store serverConfig
        this.serverConfig = serverConfig;
    }
    #endregion
}

Теперь я хотел бы использовать специальный редактор для свойства LdapPassword, поскольку это пароль, и он не должен отображаться в виде простого текста в PropertyGrid. Поскольку я не единственный и не первый, кто придумал это требование, я нашел реализацию такого редактора в раздел обсуждений проекта на Codeplex.

public class PasswordEditor : ITypeEditor
{
    #region fields
    PropertyItem _propertyItem;
    PasswordBox _passwordBox; 
    #endregion

    public FrameworkElement ResolveEditor(PropertyItem propertyItem)
    {
        _propertyItem = propertyItem;

        _passwordBox = new PasswordBox();
        _passwordBox.Password = (string)propertyItem.Value;
        _passwordBox.LostFocus += OnLostFocus;

        return _passwordBox;
    }

    private void OnLostFocus(object sender, RoutedEventArgs e)
    {
        // prevent event from bubbeling
        e.Handled = true;

        if (!_passwordBox.Password.Equals((string)_propertyItem.Value))
        {
            _propertyItem.Value = _passwordBox.Password;
        }
    }
}

Согласно документации, представленной на Codeplex, все, что нужно сделать, это добавить EditorAttribute к свойству, и все должно быть в порядке, но PasswordEditor не отображается вообще. Конструктор даже не вызывается, поэтому я предполагаю, что с объявлением EditorAttribute должна быть какая-то проблема.

В настоящее время я использую версию 2.4.0 расширенного набора инструментов WPF в проекте, настроенном для компиляции в .NET 4.5.1.

Кто-то с идеей, что может быть не так?


person slator    schedule 17.03.2015    source источник
comment
Вы используете последнюю версию WpfToolkit (2.4.0)? К какой библиотеке принадлежат локализованные атрибуты? Я попытался использовать EditorAttribute в примере проекта, и он работает правильно.   -  person Il Vic    schedule 17.03.2015
comment
Спасибо за ответ Иль Вик. Я управляю своими зависимостями через NuGet, поэтому использую версию 2.4.0 из расширенного набора инструментов WPF. Атрибуты Localized ... созданы самостоятельно, поэтому в настоящее время они находятся в одном решении. Они также работают, потому что строки правильно отображаются в PropertyGrid. Вы также использовали класс-оболочку для хранения своих свойств или использовали другой дизайн класса?   -  person slator    schedule 17.03.2015


Ответы (1)


Просто нашел решение сам. Приложение WPF включает в себя архитектуру плагинов, которая загружает все классы и их зависимости во время выполнения. Похоже, что где-то произошла ошибка при поиске классов Xceed и, следовательно, редакторов по умолчанию, которые использовались внутри PropertyGrid. Так что это была ошибка не в коде, а в конфигурации. Простите, ребята, что украли ваше время.

person slator    schedule 18.03.2015