Сетка свойств Xceed не может полностью увидеть или нажать кнопку Выбрать пустые значения

Я использую Xceed PropertyGrid с привязкой данных и AutoGenerateProperties = true. У меня есть такие свойства, как описано ниже, которые приводят к странному поведению пользовательского интерфейса.

Сетка позволяет мне нажимать на значения Да и Нет, но нулевой выбор слегка скрывается сеткой свойств и не позволяет мне щелкнуть по нему, чтобы выбрать его. Если я выберу Да и использую клавишу со стрелкой ВВЕРХ, я смогу выбрать его. Полная сетка свойств Microsoft показывает пустой выбор и позволяет мне щелкнуть по нему.

Я что-то не так делаю или это ошибка? Я спросил в GitHub Issues, но не получил ответов на мою проблему.

YesNo? _compressed;
[CategoryAttribute("Package")]
[Description("Set to 'yes' to have compressed files in the source. This attribute cannot be set for merge modules. ")]
public YesNo? Compressed { get { return _compressed; } set { _compressed = value; RaisePropertyChangedEvent("Compressed"); } }

0 ответов

Это не ошибка на самом деле. Если вы хотите отобразить значение default(YesNo?) как нечто иное, чем пустое string или же null, вам нужно определить, как вы хотите, чтобы это отображалось как-то. Вы можете сделать это, создав собственный редактор:

открытый класс CustomEditor: Xceed.Wpf.Toolkit.PropertyGrid.Editors.ComboBoxEditor {

protected override IValueConverter CreateValueConverter()
{
    return new CustomValueConverter<T>();
}

protected override ComboBox CreateEditor()
{
    ComboBox comboBox = base.CreateEditor();
    FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock));
    textBlock.SetBinding(TextBlock.TextProperty, new Binding(".") { Converter = new CustomValueConverter<T>() });
    comboBox.ItemTemplate = new DataTemplate() { VisualTree = textBlock };
    return comboBox;
}

protected override IEnumerable CreateItemsSource(Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem propertyItem)
{
    return new string[1] { CustomValueConverter<T>.Null }
        .Concat(Enum.GetValues(typeof(T)).OfType<T>().Select(x => x.ToString()));
}

}

открытый класс CustomValueConverter: IValueConverter {внутренняя константная строка Null = ""; открытый объект Convert(значение объекта, System.Type targetType, параметр объекта, культура CultureInfo) {if (value == null) return Null;

    return value.ToString();
}

public object ConvertBack(object value, System.Type targetType, object parameter, CultureInfo culture)
{
    string s = value?.ToString();
    if (s == Null)
        return null;

    return Enum.Parse(typeof(T), s);
}

}

Использование:

YesNo? _compressed;
[CategoryAttribute("Package")]
[Description("Set to 'yes' to have compressed files in the source. This attribute cannot be set for merge modules. ")]
[Editor(typeof(CustomEditor<YesNo>), typeof(CustomEditor<YesNo>))]
public YesNo? Compressed { get { return _compressed; } set { _compressed = value; RaisePropertyChangedEvent("Compressed"); } }
Другие вопросы по тегам