Я работаю с клиентским приложением WPF, которое использует список для отображения маршрута. Моя задача - реализовать функцию перетаскивания, чтобы изменить порядок элементов списка в рабочем списке, тем самым изменив порядок маршрута. Каждый из элементов в рабочем списке имеет свой собственный вид и модель представления, а также оранжевую стрелку (запускает проверку разрешений), красный номер разрешения (отображает дополнительную информацию о разрешении) и флажок (выбирает элемент для того, чтобы загрузить проверку или сохранить изменения (также активирует кнопки в представлении списка), которые находятся в этом представлении.
![itinerary Pic](https://i.stack.imgur.com/nYeB5.png)
Я выполнил перетаскивание, используя код в списке и триггер PreviewLeftMouseButtonDown. Однако, похоже, что вышеупомянутый триггер использовал триггер для флажка, но не красную кнопку или оранжевую кнопку. хотя кнопка «Выбрать все» в представлении списка все еще работает.
Вот код XAML для элемента списка, сжатый для отображения только кода флажка:
<StackPanel Grid.Row="0" Grid.Column="0" Grid.RowSpan="3">
<CheckBox ClickMode="Press" IsTabStop="False" Style="{DynamicResource CheckBoxStyle}" HorizontalAlignment="Left" VerticalAlignment="Top" IsChecked="{Binding IsSelected,Mode=TwoWay,FallbackValue='False'}" Margin="0 2 0 0"></CheckBox>
<Border BorderBrush="{DynamicResource GrayBorder}" BorderThickness="0 0 1 0"/>
</StackPanel>
Вот код для красной рамки номера разрешения, которая все еще работает для сравнения:
<StackPanel Grid.Row="0" Grid.Column="1" Margin="4 4 4 4">
<StackPanel Orientation="Horizontal">
<Button IsTabStop="False" ClickMode="Press" Command="{Binding PermitDetailViewCommand}" CommandParameter="{Binding RequestInfo.PermitNumber}" Style="{StaticResource PermitDetailButton}" Content="{Binding RequestInfo.PermitNumber, Mode=OneTime,FallbackValue=''}"/>
<Button Style="{StaticResource CriticalIconStyle}" Visibility="{Binding RequestInfo.IsCritical, Converter={StaticResource BooleanToVisibility}}" Margin="0,4,0,0" ToolTip="{Binding RequestInfo.CriticalInformation}" Height="14" IsTabStop="False"/>
<Button Style="{StaticResource ContactIconStyle}" Content="{Binding RequestInfo.ContactAttemptedCountCode}" Visibility="{Binding RequestInfo.ContactAttemptedCountCode, Converter={StaticResource StringToVisibility}}" Margin="0,2,0,0" IsTabStop="False"/>
</StackPanel>
</StackPanel>
Вот код XAML, который создает каждый элемент в списке:
<ListBox Margin="4,8" ItemsSource="{Binding Path=CheckedOutVM,Mode=TwoWay,IsAsync=True}"
SelectedItem="{Binding Path=SelectedLocalPermit}" Grid.Row="1" Grid.Column="0" BorderThickness="0"
KeyboardNavigation.TabNavigation="Continue" Name="RequestCheckedOutV" BorderBrush="{DynamicResource DarkBorder}" attprop:ArrowKeyPressed.IsEnabled="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="ClickMode.Press">
<cmd:EventToCommand
Command="{Binding SelectedLocalCommand}"
CommandParameter="{Binding SelectedItem}"
/>
</i:EventTrigger>
</i:Interaction.Triggers>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="KeyboardNavigation.IsTabStop" Value="False" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Control.HorizontalContentAlignment" Value="Center"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
<Setter Property="Control.VerticalContentAlignment" Value="Top"/>
<Setter Property="AllowDrop" Value="True"/>
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="S_PreviewMouseLeftButtonDown"/>
<EventSetter Event="Drop" Handler="listbox1_Drop"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}" >
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate >
<ContentControl Content="{Binding}" IsTabStop="False"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Вот код в поле списка, позволяющий перетаскивать:
public partial class WorklistSmallView : UserControl
{
WorklistSmallViewModel vm = new WorklistSmallViewModel();
/// <summary>
/// Initializes a new instance of the WorklistSmallView class.
/// </summary>
public WorklistSmallView()
{
InitializeComponent();
}
private void S_PreviewMouseLeftButtonDown(object sender, MouseEventArgs e)
{
WorklistSmallViewModel vm = new WorklistSmallViewModel();
ListBoxItem draggedItem = sender as ListBoxItem;
draggedItem.IsSelected = true;
DragDrop.DoDragDrop(draggedItem, draggedItem.DataContext, DragDropEffects.Move);
vm = RequestCheckedOutV.DataContext as WorklistSmallViewModel;
}
}
void listbox1_Drop(object sender, DragEventArgs e)
{
WorklistSmallDetailViewModel droppedData = e.Data.GetData(typeof(WorklistSmallDetailViewModel)) as WorklistSmallDetailViewModel;
WorklistSmallDetailViewModel target = ((ListBoxItem)(sender)).DataContext as WorklistSmallDetailViewModel;
int removedIdx = RequestCheckedOutV.Items.IndexOf(droppedData);
int targetIdx = RequestCheckedOutV.Items.IndexOf(target);
if (removedIdx < targetIdx)
{
vm = (WorklistSmallViewModel)RequestCheckedOutV.DataContext;
vm.CheckedOutVM.Insert(targetIdx + 1, droppedData);
vm.CheckedOutVM.RemoveAt(removedIdx);
}
else
{
int remIdx = removedIdx + 1;
if (vm.CheckedOutVM.Count + 1 > remIdx)
{
vm.CheckedOutVM.Insert(targetIdx, droppedData);
vm.CheckedOutVM.RemoveAt(remIdx);
}
}
foreach (var item in vm.CheckedOutVM)
{
item.RouteOrder = RequestCheckedOutV.Items.IndexOf(item) + 1;
}
RequestCheckedOutV.Items.Refresh();
}
}
Я ценю любую помощь, которая предлагается, и если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
Обновление № 1: попытки и результаты поиска и устранения неисправностей
1. Удалите динамический стиль из флажка и используйте флажок. Результаты - без изменений в флажке. кажется, что событие не попадает в элемент ListBox, за исключением того, что оно все еще позволяет нажимать кнопки.
- изменил событие на MouseLeftButtonDown в listBox. Флажок результата работает, функция перетаскивания - нет. похоже, что время PreviewMouseEvent по сравнению с обычным MouseEvent позволяет работать методом перетаскивания.