2015-09-16 10 views
6

mam ICollectionView wyglądazmienić grupę pozycji w ICollectionView

public ICollectionView UsersCollectionView 
{ 
    get 
    { 
     var view = CollectionViewSource.GetDefaultView(this); 
     view.GroupDescriptions.Add(new PropertyGroupDescription("SeriesName")); 
     view.SortDescriptions.Add(new SortDescription("CreationDate", ListSortDirection.Ascending)); 
     view.SortDescriptions.Add(new SortDescription("DocumentTypeId", ListSortDirection.Ascending)); 
     return view; 
    } 
} 

Chcę używać przeciągnij & spadek zmienić pozycję Series nazwę, a położenie na liście zobaczyć jakiś pomysł jak to zrobić, na przykład

--- ScienceFiction 
------------> Book1 
------------> Book2 
--- History 
------------> Book3 
------------> Book4 

jeśli Idraged i droped book3 w sciencefiction wyjście powinno być

--- ScienceFiction 
------------> Book1 
------------> Book2 
------------> Book3 
--- History 
------------> Book4 

używam kodu XAML tak:

<UserControl.Resources> 
    <Style x:Key="ContainerStyle" TargetType="{x:Type GroupItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Expander Header="{Binding Name}" IsExpanded="True"> 
         <ItemsPresenter /> 
        </Expander> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 
<Grid> 
    <ListBox x:Name="lbPersonList" Margin="19,17,162,25" AlternationCount="2" ItemsSource="{Binding}"> 
     <ListBox.GroupStyle> 
      <GroupStyle ContainerStyle="{StaticResource ContainerStyle}"/> 
     </ListBox.GroupStyle> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

</Grid> 

Odpowiedz

2

AMH,

Najpierw modyfikuj styl ListviewItem. Jest to kontener zawierający każdą linię (datatemplate instanciation) listbox. Jest to dobre miejsce do zarządzania Drag and Drop na poziomie linii (nie kontrola linii, może być wiele w DataTemplate). W Visual Studio, zaznacz pola listy, kliknij prawym przyciskiem myszy, Edycja dodatkowe szablony/Edycja Generated Przedmiot Container (ItemContainerStyle)/Edycja kopię

W ListBoxItemStyle stworzonego, dodać te trzy deklaracje wśród ustawiaczy:

 <EventSetter Event="ListBoxItem.DragOver" Handler="ListBoxItemDragOver"/> 
     <EventSetter Event="ListBoxItem.Drop" Handler="ListBoxItemDrop"/> 
     <EventSetter Event="ListBoxItem.PreviewMouseMove" Handler="ListBoxItemPreviewMouseMove"/> 

Ustaw właściwość AllowDrop true na ListBox:

<ListBox x:Name="listboxBooks" AllowDrop="True"> 

Następnie wdrożenie procedur obsługi w .xaml.Kod cs:

#region DnD management 

    private Book sourceBook; 
    private void ListBoxItemPreviewMouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton != MouseButtonState.Pressed) 
      return; 
     var listboxItem = sender as ListBoxItem; 
     if (listboxItem == null) 
      return; 
     sourceBook = listboxItem.DataContext as Book; 
     if (sourceBook == null) 
      return; 
     var data = new DataObject(); 
     data.SetData(sourceBook); 
     // provide some data for DnD in other applications (Word, ...) 
     data.SetData(DataFormats.StringFormat, sourceBook.ToString()); 
     DragDropEffects effect = DragDrop.DoDragDrop(listboxItem, data, DragDropEffects.Move | DragDropEffects.Copy); 
    } 
    private void ListBoxItemDrop(object sender, DragEventArgs e) 
    { 
     if (!e.Data.GetDataPresent(typeof(Book))) 
      return; 
     var listBoxItem = sender as ListBoxItem; 
     if (listBoxItem == null) 
      return; 
     var targetBook = listBoxItem.DataContext as Book; 
     if (targetBook != null) 
     { 
      viewModel.RecategorizeBook(sourceBook, targetBook.Category); 
     } 
     e.Handled = true; 
    } 
    private void ListBoxItemDragOver(object sender, DragEventArgs e) 
    { 
     Debug.WriteLine(e.Effects); 
     if (!e.Data.GetDataPresent(typeof(Book))) 
     { 
      e.Effects = DragDropEffects.None; 
      e.Handled = true; 
     } 
    } 
    private void GroupItemDrop(object sender, DragEventArgs e) 
    { 
     if (!e.Data.GetDataPresent(typeof(Book))) 
      return; 
     var groupItem = sender as GroupItem; 
     if (groupItem == null) 
      return; 
     dynamic targetGroup = groupItem.DataContext; 
     if (targetGroup != null) 
     { 
      // here I change the category of the book 
      // and refresh the view of the collectionViewSource (see link to project zipped further) 
      viewModel.RecategorizeBook(sourceBook, targetGroup.Name as String); 
     } 
     e.Handled = true; 
    } 
    #endregion 

Uwaga: Zaimplementowałem również zarządzanie zrzutami w nagłówku grupy w modułach obsługi. Więc obsługi musi być zadeklarowane w groupstyle XAML:

<ListBox.GroupStyle> 
    <GroupStyle> 
     <GroupStyle.ContainerStyle> 
      <Style TargetType="{x:Type GroupItem}"> 
       <EventSetter Event="GroupItem.Drop" Handler="GroupItemDrop"/> 
       <EventSetter Event="GroupItem.PreviewMouseMove" Handler="ListBoxItemPreviewMouseMove"/> 

to działa, tutaj jest pełny kod roboczych: http://1drv.ms/1FhBZwr

życzę możliwie kod

+0

@AMH, prawda odpowiedź na twoje pytanie? –

+0

AMH, czy spodziewasz się czegoś więcej/odmiennego, aby nagrodzić nagrodę? –

+0

Ktokolwiek w pobliżu: czy byłby przydatny, gdybym pokazał, jak wstawić upuszczony element na daną pozycję w grupie, a nie w grupie, ale w losowej pozycji? W ten sposób końcowy użytkownik będzie panem grupy. –

1

Niestety .net nie ma jeszcze dostarczyć "łatwą w użyciu" Wdrożenie drag'n'drop. Musisz samemu zbudować kilka rzeczy. Punktem początkowym będzie Behavior początek przeciągania, a ContentControl jest obszarem, na którym użytkownik może upuścić rzeczy. Po zdefiniowaniu można z łatwością ponownie wykorzystać tę koncepcję. W poniższym przykładzie StackPanel można "przeciągnąć" na niewidoczny "obszar" otaczający TextBlock. W ten sposób możesz zaimplementować ręczne sortowanie książek (upuść przed/za książką pod wskaźnikiem myszy).

Jeśli chcesz upuścić książki na swoje nagłówki, otoczyj je numerem DropArea. Można również wdrożyć obie metody.

Twój XAML będzie wyglądać następująco:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
[...] 
<ListBox x:Name="lbPersonList" Margin="19,17,162,25" AlternationCount="2" ItemsSource="{Binding}"> 
    <ListBox.GroupStyle> 
     <GroupStyle ContainerStyle="{StaticResource ContainerStyle}"/> 
    </ListBox.GroupStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <myOwn:DropArea> 
        <TextBlock Text="{Binding Name}"/> 
       </myOwn:DropArea> 
       <i:Interaction.Behaviors> 
        <myOwn:DragBehavior/> 
       </i:Interaction.Behaviors> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

DragBehavior będzie wyglądać następująco:

public class DragBehavior : Behavior<FrameworkElement> 
    [...] 
    protected override void OnAttached() 
    { 
     AssociatedObject.MouseMove += AssociatedObject_MouseMove; 
     AssociatedObject.MouseDown += AssociatedObject_MouseLeftButtonDown; 
     AssociatedObject.MouseLeave += AssociatedObject_MouseLeave; 
     base.OnAttached(); 
    } 
    protected override void OnDetaching() 
    { 
     AssociatedObject.MouseMove -= AssociatedObject_MouseMove; 
     AssociatedObject.MouseDown -= AssociatedObject_MouseLeftButtonDown; 
     AssociatedObject.MouseLeave -= AssociatedObject_MouseLeave; 
     base.OnDetaching(); 
    } 
    protected virtual void AssociatedObject_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (some condition of mouse button states or mouse moves) 
     { 
       DataObject data = new DataObject(); 
       data.SetData(typeof(anyKeyType), anyData); 
       data.SetData(typeof(anyOtherKeyType), anyOtherData); 
       DragDrop.DoDragDrop(fe, data, DragDropEffects.Move);     
     } 
    } 

DropArea będzie wyglądać następująco:

public class DropArea : ContentControl 
    [...] 
    public DropArea() 
    { 
     DragEnter += AssociatedObjectDragEnter; 
     DragLeave += AssociatedObjectDragLeave; 
     DragOver += AssociatedObjectDragOver; 
     IsTabStop = false; 
     AllowDrop = true; 
    } 
    protected override void AssociatedObjectDrop(object sender, DragEventArgs e) 
    { 
     object o = e.Data.GetData(typeof(anyKeyType)); 
     //handle dropped data 
    } 

nadzieję, że może pomóc na droga. Mogą istnieć dowolne frameworki lub biblioteki, aby adresować ten problem, ale w ten sposób możesz adresować własne potrzeby.

Powiązane problemy