将所选项目拖放为列表框返回 null



我使用以下代码进行拖放和以下语句

我在调试中检查时返回 null,这里有什么问题?

var mySelectedItem = listbox1.选定项作为列表框项;

public MainWindow()
{
    InitializeComponent();
    _UsersList.Add(new User {Name = "Mike"});
    _UsersList.Add(new User { Name = "Nick" });
    listbox1.ItemsSource = _UsersList;
}
public ObservableCollection<User> userList
{
    get { return _UsersList; }
}
private void listbox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.AddedItems.Count > 0 && string.IsNullOrEmpty(textbox1.Text))
    {
        if (listbox1.SelectedItems.Count > 0)
        {
            var mySelectedItem = listbox1.SelectedItem as ListBoxItem;
            if (mySelectedItem != null)
            {
                DragDrop.DoDragDrop(listbox1,  DragDropEffects.Copy);
            }
        }
    }
}

XAML 是

<ListBox x:Name="listbox1" HorizontalAlignment="Left" Height="115" Margin="100,75,0,0" 
                  VerticalAlignment="Top" Width="150" ItemsSource="{Binding userList}" 
                  SelectionChanged="listbox1_SelectionChanged" >

更新:

当我将lilstBOXItem更改为用户或按照答案中的建议使用以下方法时,我得到不同的错误:

 var mySelectedItem = listbox1.ItemContainerGenerator
                        .ContainerFromItem(listbox1.SelectedItem) as ListBoxItem;

private void textbox1_PreviewDrop(object sender, DragEventArgs e)
    {
        string name = e.Data.GetData(DataFormats.StringFormat).ToString();
        textbox1.Text += name;
        textbox1.Focus();
        textbox1.CaretIndex = textbox1.Text.Length;
        e.Handled = true;
        listbox1.Items.Remove(listbox1.SelectedItem);
    }

列表框 1 中的错误。Items.Remove(listbox1.选定项);此语句负责删除从列表框中选择并拖动到文本框的项目

peration is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead."}

SelectedItem的类型为 User

如果你想得到容器,即 ListBoxItem你可以得到这种方式:

var mySelectedItem = listBox1.ItemContainerGenerator
                        .ContainerFromItem(listBox1.SelectedItem) as ListBoxItem;

这将获得托管 User 类型的对象的实际容器。


更新

而不是

listbox1.Items.Remove(listbox1.SelectedItem);

您应该从 ItemsSource 集合中删除,并且自其ObservableCollection<User>以来,它将自动更新 UI。

_UsersList.Remove(listBox1.SelectedItem)

试试这个

var mySelectedItem = listbox1.SelectedItem as User;

您的项目源是类型用户的集合,因此所选项将是用户类型而不是列表框项

最新更新