在 WPF 列表框中获取所选项的文本

3

我在WPF控件中有一个数据绑定的列表框。我想要的只是选定索引的文本。如果我使用SelectedItem.ToString,我会得到键和文本。如果我使用SelectedValue.ToString,我只会得到键。

一些论坛建议像下面这样进行转换,但似乎并不起作用。

InputName nameInput = new InputName((ListBoxItem)LbContractors.SelectedItem.ToString()));

这是我绑定控件的方式。这会导致问题吗?

LbContractors.ItemsSource = myDictionary;
LbContractors.SelectedValuePath = "Key";
LbContractors.DisplayMemberPath = "Value";

如果你可以获取键,为什么不直接从字典中获取值呢? - Gordon Allocman
那时字典已经超出了范围。我从SQL数据库中加载项目。我使用字典作为临时容器。我想我可以让字典保持存在,但为什么不能像在winform中那样简单地获取文本呢? - Jeebwise
LbContractors仍然拥有它的副本,因为它需要它,所以你可以随时从LbContractors.ItemsSource获取它。虽然可能有更好的解决方案,但这只是一种方式。 - Gordon Allocman
如果你要丢弃字典,为什么不一开始就绑定一个List<String>呢? - paparazzo
3个回答

8
这应该能解决问题。
(LbContractors.SelectedItem as ListBoxItem).Content.ToString();

更新

或者尝试这样做。将其转换为可空的KeyValuePair并获取对应的值。

var kvp = (KeyValuePair<string, object>?) LbContractors.SelectedItem);
if(kvp != null && kvp.Value != null) {
    string selectedText = kvp.Value.ToString();
}

在进行空值检查的一行代码中 :)
string selectedText = ((KeyValuePair<string, object>?) LbContractors.SelectedItem)?.Value?.ToString();

当我使用它时,我得到了一个空引用异常。 我需要在特定的地方使用该调用吗?目前,我正在尝试在上下文菜单触发的OnClick事件中使用它。 - Jeebwise

0
为什么我不能像在Winform中那样简单地获取文本?
如果对象被正确取消引用,就可以获取文本...
我想要的只是所选索引的文本。
但是根据你的例子,键值对结构体的ToString()文本应该返回什么? 你有重载ToString()吗?
两个问题需要解决:
1.确定SelectedItem不为空吗? 在访问之前检查该条件。 2.应该将其强制转换为适当的结构(KVP),而不是盲目调用ToString()并引用Key或Value的适当属性。
否则,这里有一些例子。第一个是绑定到字典的列表框。
myDictionary = new Dictionary<string, string>()
                {
                    {"Alpha", "The First Letter"},
                    {"Beta", "The Second Letter"},
                    {"Omega", "Omega Letter"},
                };

当用户选择每个项目时,键和值会显示在列表框下方的文本框中:

enter image description here

Xaml

<ListBox  Name="lbDictionary"
          ItemsSource="{Binding myDictionary}"
          SelectedValuePath="Key"
          DisplayMemberPath="Value"/>

并且可以通过文本框访问它们(为了简洁起见,我不显示“键”和“值”的标签)

<TextBlock Text="{Binding SelectedItem.Key, ElementName=lbDictionary}"/>
...
<TextBlock Text="{Binding SelectedItem.Value, ElementName=lbDictionary}"/>

因此,在代码后台访问Key的方式如下,Value也是一样的:
if (lbDictionary.SelectedItem != null)
    MessageBox.Show(((KeyValuePair<string, string>) (lbDictionary.SelectedItem)).Key);
else
    MessageBox.Show("Select something");

-2

如果你只是想要这个,为什么不使用LblContractors.Text;呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接