C# - 列表框键/值对

时间:2013-01-28 13:16:00

标签: c# windows-phone-7 user-interface

我有一个字典,其中包含如下数据:

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; }

 }

但是这没用。有没有人有任何建议?

谢谢:)

3 个答案:

答案 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模式齐头并进,而框架只是让事情变得简单

如果您有兴趣,可以在这里轻松搞定:

https://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=Documentation

同一个tut的另一个变体有更多信息:

http://buksbaum.us/2010/08/01/caliburn-micro-hello-world/

答案 1 :(得分:0)

我知道WPF,有点类似。 在那里,您可以使用名为数据绑定的控件将控件绑定到集合。

http://msdn.microsoft.com/en-us/magazine/cc163299.aspx

http://blogs.msdn.com/b/wriju/archive/2011/07/25/windows-phone-7-binding-data-to-listbox-through-code.aspx

答案 2 :(得分:0)

我认为您只需要覆盖ToString课程中的Test功能,它应该按照您的意愿运作

像这样:

public override string ToString()
{
   return Value;
}