我如何在ViewModel中使用RadDragAndDrop的事件

时间:2012-02-10 09:46:23

标签: silverlight silverlight-4.0 mvvm-light silverlight-toolkit

我正在使用带有ListBox的telrik RadDragAndDrop工具。我正在使用带有mvvm灯的silverlight。我的问题是我应该如何在ViewModel中使用此代码。这是一个代码隐藏文件。

 public Construtor()
    {
        InitializeComponent();
        RadDragAndDropManager.AddDragQueryHandler(this, OnDragQuery);
        RadDragAndDropManager.AddDragInfoHandler(this, OnDragInfo);
        RadDragAndDropManager.AddDropQueryHandler(this, OnDropQuery);
        RadDragAndDropManager.AddDropInfoHandler(this, OnDropInfo);
    }
    private void OnDropInfo(object sender, DragDropEventArgs e)
    {
        ItemsControl box = e.Options.Destination as ItemsControl;
        IList<Section> itemsSource = box.ItemsSource as IList<Section>;
        Section section = e.Options.Payload as Section;

        if (e.Options.Status == DragStatus.DropComplete)
        {
            if (!itemsSource.Contains(section))
            {
                itemsSource.Add(section);
            }
        }
    }

    void OnDropQuery(object sender, DragDropQueryEventArgs e)
    {
        ItemsControl box = e.Options.Destination as ItemsControl;
        IList<Section> itemsSource = box.ItemsSource as IList<Section>;
        Section section = e.Options.Payload as Section;
        e.QueryResult = section != null && !itemsSource.Contains(section);
    }

    void OnDragInfo(object sender, DragDropEventArgs e)
    {
        ListBoxItem listBoxItem = e.Options.Source as ListBoxItem;
        ListBox box = ItemsControl.ItemsControlFromItemContainer(listBoxItem) as ListBox;
        IList<Section> itemsSource = box.ItemsSource as IList<Section>;
        Section section = e.Options.Payload as Section;
        if (e.Options.Status == DragStatus.DragComplete)
        {
            if (section != null && itemsSource.Contains(section))
            {
                itemsSource.Remove(section);
            }
        }
    }

    protected virtual void OnDragQuery(object sender, DragDropQueryEventArgs e)
    {
        ListBoxItem listBoxItem = e.Options.Source as ListBoxItem;
        ListBox box = ItemsControl.ItemsControlFromItemContainer(listBoxItem) as ListBox;
        if (e.Options.Status == DragStatus.DragQuery && box != null)
        {
            e.Options.Payload = box.SelectedItem;
            ContentControl cue = new ContentControl();
            cue.Content = box.SelectedItem;
            e.Options.DragCue = cue;
        }
        e.QueryResult = true;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        SelectingQuestionsWindow window = new SelectingQuestionsWindow();
        window.Show();
        this.radExpander1.Visibility = System.Windows.Visibility.Visible;
    }

&LT; * XAML * &GT; 这是我的Xaml。

        <ListBox x:Name="SectionListBoxMain" Height="165" Width="200" SelectedItem="{Binding SelectedSectionList}"
                        DisplayMemberPath="SectionName" ItemsSource="{Binding SectionList}" ItemContainerStyle="{StaticResource draggableItemStyle}">

            <telerik:RadDragAndDropManager.AllowDrop>
                true
            </telerik:RadDragAndDropManager.AllowDrop>

        </ListBox>

        <TextBlock Width="20" />

        <ListBox x:Name="SectionListBox" Height="167" Width="200" ItemsSource="{Binding SelectedSectionList}" telerik:RadDragAndDropManager.AllowDrop="True" DisplayMemberPath="SectionName" ItemContainerStyle="{StaticResource draggableItemStyle}">

            </ListBox>

    </StackPanel>

1 个答案:

答案 0 :(得分:1)

这是视图逻辑,它实际上并不属于您的ViewModel。它可能更适合行为。

请参阅此示例:http://www.telerik.com/help/silverlight/raddraganddrop-within-radgridview.html

他们使用行为并将其附加到网格以启用行重新排序。您可以从以下内容开始:

public partial class ListDragDropBehavior : Behavior<ListBox>

您需要添加一些依赖项属性以绑定到另一个列表框。

然后,只需将其附加到列表框(我使用blend来附加行为),就可以在其他列表框中使用此行为。