从列表框XAML中选择的项目

时间:2015-10-18 00:47:32

标签: wpf xaml data-binding listbox

我正在尝试使用listbox_SelectionChanged()方法从ListBox中获取所选项目,但它似乎不起作用。你能告诉我什么是从列表框中取出所选项目的最佳方法。我试过的代码如下。

非常感谢你的帮助。

XAML

<ListBox
            x:Name="lbSkills"
            Grid.Row="1"
            Margin="10,0,10,10" SelectionChanged="LbSkills_SelectionChanged">
                <ListBox.ItemContainerStyle>
                    <Style TargetType="ListBoxItem">
                        <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
                    </Style>
                </ListBox.ItemContainerStyle>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Border BorderThickness="0,0,0,1" BorderBrush="Beige">
                            <Grid Width="auto" HorizontalAlignment="Stretch">
                                <TextBlock VerticalAlignment="Center" FontSize="26" Grid.Column="0" Foreground="Black" Text="{Binding SkillDescription}"/>
                            </Grid>
                        </Border>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

XAML.cs - 我也尝试了注释代码,但无法获取所选项目

 private async void LbSkills_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        //var addedItems = e.AddedItems;
        //string selectedSkillString = "None";
        //if (addedItems.Count > 0)
        //{
        //   var selectedSkill = addedItems[0];
        //    selectedSkillString = selectedSkill.ToString();
        //}

        //lbSkills.SelectedItem.ToString();

        MessageDialog msgBox = new MessageDialog(e.AddedItems.ToString());
        await msgBox.ShowAsync();
    }

1 个答案:

答案 0 :(得分:0)

  1. 首先检查ListBox的DataConntext或ItemsSource是什么(它必须是ObservableCollection以避免内存泄漏)。
  2. 检查“输出”窗口中是否存在“绑定”错误。
  3. 检查是否有要绑定的correcct属性。
  4. 尝试解决方案的下一个解决方案: 我可以理解你的问题是,事件参数的添加项目不包含当前所选项目。但是你的代码没有任何问题。当我使用它时,它返回实际模型(技能)。但是如果你对它应用ToString()方法,你就不会得到真正的模型,结果将只是一个类的全名(<Full.Assembly.Path>.<Class_Name>)。如果要获取模型实例,则必须强制转换或安全地转换e.AddedItems内容,或者必须覆盖模型类中的ToString()方法。另一方面,如果您想出于某种原因想要获取ListBoxItem本身,请尝试使用下一个代码:

     var listBox = sender as ListBox;
        var selected = e.AddedItems.Cast<object>().FirstOrDefault();
        var container = listBox.ItemContainerGenerator.ContainerFromItem(selected);
    
  5. 问候