2015-09-16 3 views
6

में आइटम के समूह को बदलने मैं ICollectionView लग रहा है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; 
    } 
} 

मैं उदाहरण के लिए ऐसा करने के लिए खींचें & बूंद का उपयोग करने के लिए किसी भी उपाय को देखते कैसे आइटम श्रृंखला का नाम, और सूची स्थान बदलना चाहते है

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

अगर Idraged और विज्ञान कथा साहित्य में droped book3 उत्पादन होना चाहिए

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

मैं इस तरह XAML कोड का उपयोग करें:

<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> 

उत्तर

2

AMH,

पहले ListViewItem शैली को संशोधित। यह कंटेनर है जिसमें सूची बॉक्स की प्रत्येक पंक्ति (डेटामैप्लेट इंस्टानियस) शामिल है। लाइन स्तर पर ड्रैग और ड्रॉप को प्रबंधित करने के लिए यह एक अच्छी जगह है (लाइन के नियंत्रण पर नहीं, डेटा टेम्पलेट में बहुत से लोग हो सकते हैं)। दृश्य स्टूडियो में, लिस्टबॉक्स का चयन करें, ठीक है, क्लिक करें अतिरिक्त टेम्पलेट्स संपादित करें/संपादित जेनरेट किए गए आइटम कंटेनर (ItemContainerStyle) /, एक प्रति

बनाया ListBoxItemStyle में संपादित करें setters के बीच उन तीन घोषणाओं जोड़ें:

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

ListBox पर सत्य पर AllowDrop संपत्ति सेट करें:

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

फिर .xaml में संचालकों को लागू।सीएस कोड:

#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 

ध्यान दें कि मैंने हैंडलरों में समूह शीर्षलेख पर ड्रॉप प्रबंधन भी लागू किया है। तो हैंडलर XAML groupstyle में घोषित किए जाने की जरूरत: http://1drv.ms/1FhBZwr

, तो आप सबसे अच्छा संभव कोड

+0

@AMH काश ना:

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

यह काम करता है, यहाँ पूर्ण काम कर कोड है आप का जवाब सवाल है? –

+0

एएमएच, क्या आप बकाया पुरस्कार देने के लिए कुछ और अलग उम्मीद करते हैं? –

+0

किसी के आस-पास: क्या यह उपयोगी होगा यदि मैंने दिखाया कि समूह में किसी दिए गए स्थान पर गिराए गए तत्व को कैसे सम्मिलित किया जाए, समूह में नहीं, बल्कि यादृच्छिक स्थिति पर? इस तरह अंतिम उपयोगकर्ता समूह का मालिक होगा। –

1

दुर्भाग्य से .net अभी तक एक ड्रैग एंड ड्रॉप के कार्यान्वयन "का उपयोग करने के लिए आसान" प्रदान नहीं करता है। आपको अपने आप पर चीजों का एक गुच्छा बनाना है। शुरुआती बिंदु Behavior ड्रैग शुरू करने और ContentControl उस क्षेत्र के रूप में होगा जहां उपयोगकर्ता चीजें छोड़ सकता है। परिभाषित होने के बाद आप आसानी से इस अवधारणा का पुन: उपयोग कर सकते हैं। निम्नलिखित उदाहरण में StackPanel को TextBlock के आस-पास एक अदृश्य "क्षेत्र" पर "खींचा जा सकता है"। इस तरह आप अपनी पुस्तकों को मैन्युअल रूप से सॉर्ट करने में सक्षम होते हैं (माउस पॉइंटर के नीचे पुस्तक के पहले/पीछे छोड़ें)।

यदि आप अपने शीर्षकों पर किताबें ड्रॉप करना चाहते हैं तो उन्हें DropArea से घिराएं। आप दोनों तरीकों को भी लागू कर सकते हैं।

आपका XAML तरह दिखेगा:

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 तरह दिखेगा:

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 तरह दिखेगा: पर आप मदद कर सकते हैं

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 
    } 

आशा अपने मार्ग। उस मुद्दे को हल करने के लिए कोई ढांचा या पुस्तकालय हो सकता है, लेकिन इस तरह आप अपनी खुद की जरूरतों को पूरा कर सकते हैं।

संबंधित मुद्दे