列表框没有绑定仅仅是Combobox替换(值暴露)
的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>
CodeBehind
private void LBX_AddTaskOptions_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var SelItm = LBX_AddTaskOptions.SelectedItem.ToString();
MessageBox.Show(Sel);
}
我搜索过这个问题,但答案仅针对复杂问题 因为我是新鲜的.net开发人员,我知道提取DDL文本/值的所有方法 我甚至做了扩展,但无法知道如何进行这种简单的值提取
不应该简单吗?
messageBox显示控件的名称(:
答案 0 :(得分:2)
对于XAML来说,这不是一个正确的方法。您不希望列出每个项目的标记 - 而是使用ItemTemplate
来定义它的外观,并使用绑定来呈现实际项目:
<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
转换为ListBoxItem
,然后获取其子项并将 转换为StackPanel,获取其子项等,您就明白了。然后,当然,如果标记发生了变化,那么您刚刚编写的代码将不再有效。
答案 1 :(得分: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的字符串。