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

时间:2014-01-05 16:49:37

标签: c# wpf xaml mvvm listbox

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

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

var mySelectedItem = listbox1.SelectedItem as ListBoxItem;

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);
    }

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

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

2 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:1)

试试这个

var mySelectedItem = listbox1.SelectedItem as User;

您的ItemsSource是Type User的集合,因此SelectedItem将属于Type UserIile而不是ListBoxItem