我在winform上放置了一个下拉控件。今天,此下拉菜单的数据源是KeyValuePair<'string','string'>因此,可以很容易地直接将下拉列表中的“DisplayMember”属性分配给KeyValuePair中的“Value”。
我的一个要求是将此数据源更改为KeyValuePair<'string',KeyValuePair<'string','string'>。当我运行我的代码时,这给我带来了问题。这是因为'DisplayMember'设置为'Value'会导致下拉项显示为('AB')(其中'A'和'B'是KeyValuePair中的相应字符串<'string','string'> of新的数据源)。
我想将下拉菜单的'DisplayMember'属性分配给KeyValuePair中的'Key'<'string','string'>来自更改的数据源。
旧要求 -
KeyValuePair<'string','string'>('A','B')
下拉项目显示 - 'B'
新要求 -
KeyValuePair<'string',KeyValuePair<'string','string'>('A', new KeyValuePair<'B','C'>)
下拉项应显示 - 'B'
是否可以仅使用下拉属性更改来实现工具?
检查了数据源,但它只显示了Key-Value对的顶层,而不是层次模型。
答案 0 :(得分:1)
不幸的是,您无法使用DisplayMember
绑定到嵌套属性。因此,尝试将DisplayMember
设置为"Value.Key"
之类的内容并不起作用。但是,我建议创建一个自定义类型,将KeyValuePair<string, KeyValuePair<string, string>>>
类型包装到一个对象中,并为其提供易于访问的属性。这是一个例子:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// This was the old way
//List<KeyValuePair<string, KeyValuePair<string, string>>> myList = new List<KeyValuePair<string, KeyValuePair<string, string>>>();
//myList.Add(new KeyValuePair<string, KeyValuePair<string, string>>("A", new KeyValuePair<string, string>("B", "C")));
//myList.Add(new KeyValuePair<string, KeyValuePair<string, string>>("D", new KeyValuePair<string, string>("E", "F")));
//myList.Add(new KeyValuePair<string, KeyValuePair<string, string>>("G", new KeyValuePair<string, string>("H", "I")));
// This is the new way
List<CustomKeyValuePairWrapper> myList = new List<CustomKeyValuePairWrapper>();
myList.Add(new CustomKeyValuePairWrapper("A", new KeyValuePair<string, string>("B", "C")));
myList.Add(new CustomKeyValuePairWrapper("D", new KeyValuePair<string, string>("E", "F")));
myList.Add(new CustomKeyValuePairWrapper("G", new KeyValuePair<string, string>("H", "I")));
comboBox1.DataSource = myList;
comboBox1.DisplayMember = "ValueKey";
}
}
public class CustomKeyValuePairWrapper
{
public string Key { get; private set; }
public KeyValuePair<string, string> Value { get; private set; }
public string ValueKey
{
get { return Value.Key; }
}
public CustomKeyValuePairWrapper(string key, KeyValuePair<string, string> value)
{
Key = key;
Value = value;
}
}
答案 1 :(得分:0)
尝试以下方法:
public class CustomKeyValuePair
{
public CustomKeyValuePair(string key, string value)
{
this.Key = key;
this.Value = value;
}
public string Key { get; set; }
public string Value { get; set; }
public override string ToString()
{
return Key;
}
}
KeyValuePair<'string',KeyValuePair<'string',CustomKeyValuePair>('A', new CustomKeyValuePair('B','C'))