0

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

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

 }

但这没有用。有没有人有什么建议?

谢谢 :)

4

3 回答 3

3

您需要DataTemplate在您的中使用 aListBox以确保列表框知道如何呈现其内容。假设您遵循上述基于类的方法:

<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)。

您的代码不会更复杂,但某些事情会为您连接起来,它会为您提供更多关于绑定等问题的反馈(有些绑定很难弄清楚,尤其是当弹出窗口/上下文菜单是涉及)

如果您对基于 XAML 的技术进行开发是认真的,它们与 MVVM 模式齐头并进,而一个框架让事情变得轻而易举

If you are interested there's an easy to follow tut here:

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

Another variation on the same tut with a bit more info is here:

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

于 2013-01-28T15:07:26.730 回答
1

我认为你只需要覆盖ToString你的类中的函数Test,它应该可以按照你的意愿工作

像这样:

public override string ToString()
{
   return Value;
}
于 2013-01-28T13:20:23.920 回答
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

于 2013-01-28T13:20:17.670 回答