ListBoxDragDropTarget不会重新排序使用继承的元素

Faf*_*fnr 4 silverlight silverlight-toolkit silverlight-4.0

我有一个非常奇怪的问题,我不知道如何调试它.(旁注:我讨厌创建GUI!无论如何...... :)

我一直在遵循指南,在Silverlight上使用drag'n drop.现在,我感兴趣的是列表中的重新排序.

如果我完全按照网站上的例子,一切都很好.它按预期工作. 但是,当我尝试用其他东西替换元素时,我再也无法重新排序了?!

考虑以下XAML:

<toolkit:ListBoxDragDropTarget AllowDrop="True">
                <ListBox Width="200" Height="500" x:Name="FromBox" DisplayMemberPath="Label">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel/>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>
            </toolkit:ListBoxDragDropTarget>
Run Code Online (Sandbox Code Playgroud)

除了DisplayMemberPath(此处为"Label")之外,这与我正在阅读的文章相同.

在代码隐藏中,我现在执行以下操作:

void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            FromBox.ItemsSource = GetElements();
        }

        public static ObservableCollection<Element> GetElements()
        {
            ObservableCollection<Element> Elements = new ObservableCollection<Element>();
            var Label = new Label();
            Label.Label = "Label me";
            Elements.Add(Label);

            var IntegerBox = new IntegerBox();
            IntegerBox.Label = "Størrelsen på en gennemsnits svale:";
            IntegerBox.Description = "cm";
            Elements.Add(IntegerBox);

            var TextBox = new TextBox();
            TextBox.Label = "QTTextBox";
            Elements.Add(TextBox);

            return Elements;
        }
Run Code Online (Sandbox Code Playgroud)

(抱怨在这一点上包含特殊的丹麦字符,但我认为最好显示我使用的确切代码而不是编辑它)

如您所见,我返回一个元素的ObservableCollection,每个元素都有一个Label属性(显然它们都继承自Element类).

对我来说,这应该与链接中提供的代码完全相同.但事实并非如此.就好像我再也不能丢弃物品了!?

这就是它在文章中的样子:

替代文字

这就是我的元素的外观:

替代文字

对可以重新排序的东西有什么需求吗?本文使用Person-objects,但这些只是非常简单,并没有实现任何进一步的接口.正如您所见,我也确保使用具有正确类型的ObservableCollection.是因为它无法处理继承吗?!

......或者我只是愚蠢?:-)

提前致谢!

编辑:我已经将问题缩小到与继承有关.以下代码也无法重新排序:

public class People
    {
        public static ObservableCollection<Person> GetListOfPeople()
        {
            ObservableCollection<Person> ppl = new ObservableCollection<Person>();
            for (int i = 0; i < 15; i++)
            {
                if (i % 2 == 0)
                {
                    SomePerson p = new SomePerson() { Firstname = "First " + i.ToString(), Lastname = "Last " + i.ToString() };
                    ppl.Add(p);
                }
                else
                {
                    OtherPerson p = new OtherPerson() {Firstname = "First " + i.ToString(), Lastname = "Last " + i.ToString()};
                    ppl.Add(p);
                }

            }
            return ppl;
        }
    }

    public class Person
    {
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        public string FullName
        {
            get
            {
                return string.Concat(Firstname, " ", Lastname);
            }
        }
    }
    public class SomePerson : Person
    {

    }

    public class OtherPerson : Person
    {

    }
Run Code Online (Sandbox Code Playgroud)

WTF?看来你只能重新排序具有在ObservableCollection上声明为type-parameter 的特定类型的元素.因此,如果我声明它包含"Person"对象并混合Person-objects而不是SomePerson和OtherPerson,我可以移动它们.

Chr*_*nes 5

我有同样的问题,并做了一点挖掘.继承人我的解决方案:http://cjbhaines.wordpress.com/2011/07/09/silverlight-listboxdragdroptarget-why-cant-i-drop-it-there/