Xceed 属性 网格无法完全查看或单击 Select 空值
Xceed Property Grid Can't Completely See or Click Select Null values
我正在使用具有数据绑定和 AutoGenerateProperties = true 的 Xceed PropertyGrid。我有如下所述的可为 null 的属性,这些属性会导致奇怪的 UI 行为。
网格让我可以点击值 Yes 和 No,但是 null 选择被 属性 网格稍微遮住了,不允许我点击它 select 它。如果我 select 是并使用向上箭头键我可以 select 它。 Microsoft 属性 grid full 显示空选项并允许我单击它。
我是不是做错了什么或者这是一个错误?我在 GitHub 问题中提问,但我的 issue.
没有得到回复
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"); } }
这真的不是错误。如果您想将 default(YesNo?)
的值显示为空 string
或 null
以外的值,则需要定义您希望它以某种方式显示的方式。您可以通过创建自己的自定义编辑器来做到这一点:
public class 自定义编辑器: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()));
}
}
public class CustomValueConverter: IValueConverter
{
内部常量字符串 Null = "";
public 对象转换(对象值,System.Type targetType,对象参数,CultureInfo 文化)
{
如果(值==空)
return空;
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"); } }
我正在使用具有数据绑定和 AutoGenerateProperties = true 的 Xceed PropertyGrid。我有如下所述的可为 null 的属性,这些属性会导致奇怪的 UI 行为。
网格让我可以点击值 Yes 和 No,但是 null 选择被 属性 网格稍微遮住了,不允许我点击它 select 它。如果我 select 是并使用向上箭头键我可以 select 它。 Microsoft 属性 grid full 显示空选项并允许我单击它。
我是不是做错了什么或者这是一个错误?我在 GitHub 问题中提问,但我的 issue.
没有得到回复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"); } }
这真的不是错误。如果您想将 default(YesNo?)
的值显示为空 string
或 null
以外的值,则需要定义您希望它以某种方式显示的方式。您可以通过创建自己的自定义编辑器来做到这一点:
public class 自定义编辑器: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()));
}
}
public class CustomValueConverter: IValueConverter { 内部常量字符串 Null = ""; public 对象转换(对象值,System.Type targetType,对象参数,CultureInfo 文化) { 如果(值==空) return空;
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"); } }