【问题标题】:selected item from listbox XAML从列表框 XAML 中选择的项目
【发布时间】:2016-01-16 13:06:40
【问题描述】:

我正在尝试使用 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();
    }

【问题讨论】:

  • 我试过你的代码,当列表中的一个项目被选中时,事件被正确触发,它在lbSkills.SelectedIteme.AddedItems[0]中都有
  • lbSkills.SelectedItem 正确显示所选项目。尝试删除 async / await 并检查。
  • 嗨 ANjum,我尝试删除 async/await 但仍然相同。我只得到路径而不是选择的项目。只是提到我在 Windows 8.1(不是手机)中尝试这个。

标签: wpf xaml data-binding listbox


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

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

问候

【讨论】:

  • HI I.A Golik 我尝试了用户,但结果相同。我正在尝试这是 Windows 8.1(不是 WindowsPhone)。你认为这就是为什么我没有得到正确的结果
  • @Rao 不这么认为。我已经在 W8.1 中尝试过,并且成功了。你能更具体地说明你的结果吗?你在那里得到什么? addedItems[0] 的结果是否为空? selectedSkill.ToString() 的结果是空的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多