Я пишу пример приложения примерной книги в 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»
Я не уверен, в чем проблема? Проблема в том, что мой элемент listview является текстовым блоком? Элемент, который я отправляю, является Пользовательским объектом, и он также достигает tbFavouritesDrop_Drop
.
EDIT 1:
Я изменил свой обработчик события падения на:
private void tbFavouritesDrop_Drop(object sender, DragEventArgs e)
{
TextBlock item = (TextBlock)sender;
MessageBox.Show(item.Text);
}
Исключение не отбрасывается, однако, .Text
свойство пусто.
Мое подозрение в том, что если вы установите точку останова и пройдете через это, на самом деле исключение происходит над строкой выше, где, как представляется, это происходит. (Трассировка стека скажет вам, если вы когда-либо сделали это в методе DoDragDrop) – theB