0

列表框不只是一个组合框替换绑定(值被暴露)

Xaml

  <ListBox SelectionChanged="LBX_AddTaskOptions_SelectionChanged"  HorizontalAlignment="Left" Margin="19,29,0,0" Name="LBX_AddTaskOptions" VerticalAlignment="Top" Width="125" FontWeight="Bold" Background="Beige">
                        <ListBoxItem Background="Beige" FontWeight="Bold" v>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="internet"></TextBlock>
                                <Image Source="Images\IE_BlackRed.png" Height="30"></Image>
                            </StackPanel>
                        </ListBoxItem>
                        <ListBoxItem Background="Beige" FontWeight="Bold">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="localFolder"></TextBlock>
                                <Image Source="Images\Folder_Black.png" Height="30"></Image>
                            </StackPanel>
                        </ListBoxItem>
                    </ListBox>

代码隐藏

    private void LBX_AddTaskOptions_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var SelItm = LBX_AddTaskOptions.SelectedItem.ToString();

        MessageBox.Show(Sel);

    }

我已经搜索过这个问题,虽然答案只针对复杂问题,因为我是新的 .net 开发人员,我知道提取 DDL 文本/值的所有方法,我什至做了扩展,但不知道如何进行这个简单的值提取

不应该很简单吗?

messageBox 显示控件的名称(:

4

2 回答 2

2

这不是 XAML 的正确方法。您不想列出每个项目的标记 - 相反,使用 anItemTemplate来定义它的外观,并使用绑定来呈现实际项目:

<ListBox SelectionChanged="LBX_AddTaskOptions_SelectionChanged" Name="LBX_AddTaskOptions">
    <ListBox.ItemTemplate>
        <ListBoxItem Background="Beige" FontWeight="Bold" v>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding}" />
                <Image Source="Images\IE_BlackRed.png" Height="30" />
            </StackPanel>
        </ListBoxItem>
    </ListBox.ItemTemplate>
</ListBox>

将 ListBox 绑定ItemsSource到模型数据本身(即本例中的字符串数组)。现在,最终您可能想要使用视图模型,但您也可以在加载时从代码中添加项目:

string[] ListBoxItems = new string[] { "internet", "local folder" };
LBX_AddTaskOptions.ItemsSource = ListBoxItems;

这应该会SelectedValue为您提供正确的值。


脚注——你可以使用你在问题中写出的标记来获得选定的值——但这会很丑陋,并且会破坏 XAML 的整个目的。您需要转换SelectedItem为 a ListBoxItem,然后获取它的孩子并将转换为 StackPanel,获取它的孩子等等,您就明白了。然后,当然,如果标记发生变化,您刚刚编写的代码将不再有效。

于 2012-11-23T22:16:36.700 回答
1

您在所选值中获得的项目是一个 ListBoxItem,其中包含一个控件。如果你想像文本一样提取值,那么你必须这样做

private void LBX_AddTaskOptions_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var SelItm = LBX_AddTaskOptions.SelectedItem as ListBoxItem;
        var StackPanel = SelItm.Content as StackPanel;
        foreach (var child in StackPanel.Children)
        {
            if(child is TextBlock)
            {
                MessageBox.Show((child as TextBlock).Text);
            }
        }

}

您必须深入研究控件以获取实际文本。有很多方法可以获得价值,但这是非常基本的方法。

调用 ToString() 方法只会将当前对象转换为一个字符串,即 ListBoxItem。

于 2012-11-23T22:23:03.833 回答