Сетка свойств 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"); } }