我有一个字典,其中包含如下数据:
key Value
UK01 Building 1
UK02 Building 2
我有一个文本框,其中的数据填充如下:
foreach (var building in dictionary)
{
listbox1.Items.Add(building.Value);
}
然后显示Building 1 Building 2, ...
问题:
我想要做的是,当SelectionChanged
被触发时,我可以访问已选择的选项的键/值,并将它们存储为我稍后可以使用的变量。目前我只能选择项目,即“建筑1”或者我可以获得SelectedInded
,但这只能给我:1,2,......我理解为什么。
因此可以(优雅地)使得可以在不显示密钥的情况下访问键/值吗?我试过使用一个类:
public class Test
{
public ID { get; set; }
public value { get; set; }
}
但是这没用。有没有人有任何建议?
谢谢:)
答案 0 :(得分:3)
您需要在DataTemplate
中使用ListBox
,以确保列表框知道如何呈现内容。假设您遵循上述基于类的方法:
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding value}">
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
这会为您添加到DataTemplate
的每个项目创建一个ListBox
,其中包含一个文本块,该文本块绑定到添加的项目上的属性
阅读绑定 - 它是WPF / WP7 / Silverlight中最强大的东西之一,可能是最广泛的绑定实现之一
http://www.mono-software.com/blog/post/Mono/166/Data-binding-in-Windows-Phone-7-application/
编辑:
虽然我很确定ListBox的默认模板只是在每个项目上调用'ToString()'所以它应该正常工作!
哦,考虑让成员自动属性而不是字段:
public string ID { get; set; }
编辑:
好吧我对Linq并不好,但是因为查询应该返回IEnumerable<KeyValuePair<string, string>>
,我可以看到它,你可以枚举它并构建你的对象,例如。
var myList = new ObservableCollection<MyClass>();
foreach(var kvp in dict)
{
myList.Add(new MyClass(kvp.Key, kvp.Value));
// Or myList.Add(new MyClass() { ID = kvp.Key, Value = kvp.Value }); depending on your constructor
}
话虽如此,没有理由你不能只指向字典项的键/值(KeyValuePair<string, string>
只是一个像其他任何东西的引用类型)
此:
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Key}">
<TextBlock Text="{Binding Value}">
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
应该给你
{Key}
{Value}
{Key}
{Value}
{Key}
{Value}
在您的列表框中
假设您不需要结果项KeyValuePair
中的任何其他功能就足够了。创建一个只是为了显示某些值的类可能是过度的,因为你已经99%了。
你可能想看看一些MVVM模式,也许可以看一下MVVM框架(我有偏见因为我一直使用它,但Caliburn.Micro非常容易上手并支持WP7)。 / p>
你的代码不会更复杂,但是某些东西会被连接起来,它会给你更多关于绑定等问题的反馈(有些绑定很难弄清楚,特别是当弹出窗口时/ contextmenus参与)
如果您认真考虑开发基于XAML的技术,它们会与MVVM模式齐头并进,而框架只是让事情变得简单
如果您有兴趣,可以在这里轻松搞定:
同一个tut的另一个变体有更多信息:
答案 1 :(得分:0)
我知道WPF,有点类似。 在那里,您可以使用名为数据绑定的控件将控件绑定到集合。
答案 2 :(得分:0)
我认为您只需要覆盖ToString
课程中的Test
功能,它应该按照您的意愿运作
public override string ToString()
{
return Value;
}