.net - 从作为对象类的属性中派生 PropertyGrid 下拉列表,而不仅仅是字符串
问题描述
如何在属性网格中拥有作为对象(不仅仅是字符串)下拉列表的属性?我走了这么远,但后来卡住了!考虑下面的代码:
Public Class mOrganisation
Public Property ID as String
Public Property Name as String
End Class
Public Class mSystem
Public Property ID as string
Public Property Name as String
Public Property Developer as mOrganisation
Public Overrides Function ToString() As String
Return Name
End Function
End Class
Public Class mGame
Public Property ID as string
Public Property Name as String
<TypeConverter(GetType(SystemConverter))>
Public Property System as mSystem
End Class
Public Class Main
Public Systems as List(of mSystem) = [...list gatehring code here]
End Class
Public Class SystemConverter
Inherits TypeConverter
Public Overrides Function GetStandardValuesSupported(ByVal context As ITypeDescriptorContext) As Boolean
Return True
End Function
Public Overrides Function GetStandardValuesExclusive(ByVal context As ITypeDescriptorContext) As Boolean
Return False
End Function
Public Overrides Function GetStandardValues(ByVal context As ITypeDescriptorContext) As TypeConverter.StandardValuesCollection
Return New StandardValuesCollection(Main.Systems)
End Function
End Class
mOrgnisation 只是为了给 mSystem 类引入一些复杂性。现在这段代码确实下拉了值:
但是当我选择一个值时,我得到一个 PropertyGrid 错误“'System.String' 类型的对象无法转换为'mSystem' 类型”
这让我陷入了困境,特别是试图应用Convert From
和的各种排列Convert To
。但是,我找不到合适的解决方案。一次尝试通过ConvertFrom
使下拉菜单加载非常缓慢,一次一个项目(我认为它正在为每个项目触发)。
我会做一个自定义UITypeEditor
,但我找不到像标准下拉列表那样获得 PropertyGrid 固有的调整大小方法/句柄的方法(并尝试编写我自己的调整大小例程,但我认为由于 PropGrid +控制)
实现这一目标的最佳/最优雅的方法是什么?
解决方案
有一些方法可以告诉系统“从对象中挑选什么”
1)在组合框上使用 DisplayMemberPath:
<ComboBox ItemsSource="{Binding Path=mSystem}"
DisplayMemberPath="Name"/>
2) 在 ComboBox 上设置 ItemTemplate。这就像 #1,除了允许您定义要显示的模板:
<ComboBox ItemsSource="{Binding Path=mSystem}">
<ComboBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Green" BorderThickness="1" Padding="5">
<TextBlock Text="{Binding Path=Name,StringFormat='Name: {0}'}" />
</Border>
</DataTemplate>
</ComboBox.ItemTemplate>
3) 将 DataTemplate 添加到 XAML 资源。这对于关联给定的类很有用:
<UserControl xmlns:local="CLASS_CONTEXT_HERE">
<UserControl.Resources>
<DataTemplate DataType="local:mSystem">
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</UserControl.Resources>
4)如果你想显示 NAME 和 ID :
Public Overrides Function ToString() As String
Return string.Format("{0} ({1})", Name, ID)
End Function
推荐阅读
- eclipse - 打开eclipse时出错-MAC
- r - 在 plotly 中以交互方式选择分组变量
- java - How to break overridden method if it's base method fails?
- typescript - Unable to preview the uploaded image [rest api]
- matlab - Matlab/Octave 中的二维卷积
- c# - 使用带有 c# webclient 的 rest api PUT 方法
- c# - 带有子查询的实体框架核心总和引发无效操作异常
- javascript - Access parent window cache from iframe
- reactjs - Jest Unexpected identifier: React
- image - 如何在 MATLAB 上使用 imshowpair 调整棋盘图案的大小?