2015-09-13 5 views
0

Я пишу пример приложения примерной книги в WPF, в котором у меня есть listview, который содержит контакты как объекты пользователя, но каждый элемент представлен TextBlock, только отображающим имя.WPF ListViewItem Перетаскивание на TextBlock

Что я хочу достичь, так это то, что пользователь может перетащить элемент на «группу». Группы представлены в левой части окна. Это простой столбец сетки с несколькими пунктами TextBlock.

Моя отношение отделенного кода:

/** Display Contact in the contact pane**/ 
    private void lstItemContact_MouseDown(object sender, MouseButtonEventArgs e) 
    { 

     ListViewItem item = (ListViewItem)sender; 

     User selectedUser = (User) item.Content; 

     DragDrop.DoDragDrop(lstContacts, item, DragDropEffects.Move); 

     contactPane.Fullname = selectedUser.Name; 
     contactPane.Email = selectedUser.Mail; 
    } 

    private void tbFavouritesDrop_Drop(object sender, DragEventArgs e) 
    { 
     User dropped_user = (User)sender; 

     MessageBox.Show(dropped_user.Name); 
    } 

И XAML:

<ListView x:Name="lstContacts" Width="250" Grid.Row="1" Grid.Column="1"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" /> 
      </GridView> 
     </ListView.View> 

     <ListView.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.HeaderTemplate> 
        <DataTemplate> 
         <TextBlock x:Name="lstItemContact" FontWeight="Bold" FontSize="14" Text="{Binding Name}" /> 
        </DataTemplate> 
       </GroupStyle.HeaderTemplate> 
      </GroupStyle> 
     </ListView.GroupStyle> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="ListViewItem"> 
       <EventSetter Event="PreviewMouseLeftButtonDown" Handler="lstItemContact_MouseDown" /> 
      </Style>     
     </ListView.ItemContainerStyle> 
    </ListView> 



<TextBlock AllowDrop="True" Drop="tbFavouritesDrop_Drop" Name="tbFavouritesDrop"> 
        <Border CornerRadius="3" Background="OrangeRed" Height="7" Width="7" VerticalAlignment="Center" Margin="0 0 2 5"/> 
        <Label FontFamily="Segoe UI Light" FontSize="14" Padding="0">Favourites</Label> 
       </TextBlock> 

После того, как я перетащить элемент на группу "Избранное" Я получаю следующее сообщение об ошибке: Дополнительная информация: Не удается литой объект типа «System.Windows.Controls.TextBlock» для ввода «AddressBook1.User» enter image description here

Я не уверен, в чем проблема? Проблема в том, что мой элемент listview является текстовым блоком? Элемент, который я отправляю, является Пользовательским объектом, и он также достигает tbFavouritesDrop_Drop.

EDIT 1:

Я изменил свой обработчик события падения на:

private void tbFavouritesDrop_Drop(object sender, DragEventArgs e) 
     { 
      TextBlock item = (TextBlock)sender; 

      MessageBox.Show(item.Text); 
     } 

Исключение не отбрасывается, однако, .Text свойство пусто.

+0

Мое подозрение в том, что если вы установите точку останова и пройдете через это, на самом деле исключение происходит над строкой выше, где, как представляется, это происходит. (Трассировка стека скажет вам, если вы когда-либо сделали это в методе DoDragDrop) – theB

ответ

0

Хорошо, я нашел решение после того, как сходят с ума от другого потока: WPF Drag and Drop - Get original source info from DragEventArgs

Который оставляет меня:

/** Display Contact in the contact pane**/ 
    private void lstItemContact_MouseDown(object sender, MouseButtonEventArgs e) 
    { 

     ListViewItem item = (ListViewItem)sender; 

     User selectedUser = (User) item.Content; 

     contactPane.Fullname = selectedUser.Name; 
     contactPane.Email = selectedUser.Mail; 
    } 

    private void lstItemContact_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      if (e.Source != null) 
      { 
       User selectedItem = (User) lstContacts.SelectedItem; 

       DragDrop.DoDragDrop(lstContacts, selectedItem, DragDropEffects.Move); 
      } 
     } 
    } 

    private void tbFavouritesDrop_Drop(object sender, DragEventArgs e) 
    { 
     User selectedUser = e.Data.GetData("AddressBook1.User") as User; 
     MessageBox.Show(selectedUser.Name); 

    } 

Я надеюсь, что помогает кому-то еще. Дело здесь состояло в том, чтобы использовать e.Data.GetData("AddressBook1.User") и не работать с отправителем.

Смежные вопросы