Сетка свойств Xceed не может полностью увидеть или нажать кнопку Выбрать пустые значения - PullRequest
0 голосов
/ 02 марта 2019

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

Сетка позволяет мне нажимать на значения Да и Нет, но нулевой выбор слегка скрыт сеткой свойств и не позволяет мнещелкните по нему, чтобы выбрать его.Если я выберу Да и использую клавишу со стрелкой ВВЕРХ, я смогу выбрать его.Полная сетка свойств 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"); } }

enter image description here

1 Ответ

0 голосов
/ 04 марта 2019

Это не ошибка на самом деле.Если вы хотите отобразить значение 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()));
}

}

publicclass 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"); } }
...