Silverlight ListBoxDragDropTarget赢得';t重新排序使用继承的元素

Silverlight ListBoxDragDropTarget赢得';t重新排序使用继承的元素,silverlight,silverlight-4.0,silverlight-toolkit,Silverlight,Silverlight 4.0,Silverlight Toolkit,我有一个非常奇怪的问题,我不知道如何调试它。(旁注:我讨厌创建GUI!无论如何…:) 我一直遵循在Silverlight上使用拖放的指南。 现在,我感兴趣的是列表中的重新排序 如果我完全按照网站上的例子,一切都很好。它按预期工作。 但是,当我尝试用元素替换其他元素时,我无法再重新排序 考虑以下XAML: <toolkit:ListBoxDragDropTarget AllowDrop="True"> <ListBox Width="200" He

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

我一直遵循在Silverlight上使用拖放的指南。 现在,我感兴趣的是列表中的重新排序

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

考虑以下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>

除了这里的DisplayMemberPath“标签”之外,这与我下面的文章中的内容相同

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

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;
        }
void主页\u已加载(对象发送方,路由目标)
{
FromBox.ItemsSource=GetElements();
}
公共静态ObservableCollection GetElements()
{
ObservableCollection元素=新的ObservableCollection();
var Label=新标签();
Label.Label=“Label me”;
元素。添加(标签);
var IntegerBox=新的IntegerBox();
IntegerBox.Label=“Størrelsen påen gennemsnits svale:”;
IntegerBox.Description=“cm”;
元素。添加(整数框);
var TextBox=新的TextBox();
TextBox.Label=“QTTextBox”;
元素。添加(文本框);
返回元素;
}
(很抱歉在这里包含特殊的丹麦字符,但我认为最好显示我正在使用的确切代码,而不是将其编辑掉)

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

对我来说,这应该与链接中提供的代码完全相同。 但事实并非如此。好像我再也不能扔东西了

这是文章中的内容:

这就是我的元素的外观:

对那些可以重新排序的东西有什么需求吗?本文使用Person对象,但这些对象非常简单,并且没有实现任何进一步的接口。正如您所见,我还确保使用类型正确的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
    {

    }
公共阶层人士
{
公共静态ObservableCollection GetListOfPeople()
{
ObservableCollection ppl=新的ObservableCollection();
对于(int i=0;i<15;i++)
{
如果(i%2==0)
{
SomePerson p=newsomeperson(){Firstname=“First”+i.ToString(),Lastname=“Last”+i.ToString()};
ppl.Add(p);
}
其他的
{
OtherPerson p=newotherPerson(){Firstname=“First”+i.ToString(),Lastname=“Last”+i.ToString();
ppl.Add(p);
}
}
返回ppl;
}
}
公共阶层人士
{
public string Firstname{get;set;}
公共字符串Lastname{get;set;}
公共字符串全名
{
得到
{
返回字符串.Concat(Firstname,“,Lastname);
}
}
}
公共类某人:某人
{
}
公共类其他人:个人
{
}
WTF?!
似乎您只能对具有声明为ObservaleCollection上的type参数的specific类型的元素重新排序。因此,如果我声明它包含“Person”对象,并混合Person对象而不是SomePerson和OtherPerson,我可以移动那些

我也有同样的问题,并且做了一些测试。我的结论是,这不是用户生成的错误,而是工具箱中的错误。因此,我已经把这件事做成了一个问题,并将其发布给silverlight团队。请投票表决这个问题,以便我们能得到一个快速的答案


如果您认为这有帮助,请标记为答案。

我也想到了一个解决方案,我知道这是一个肮脏的解决方案,但它确实起到了作用:

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

}

public class PersonWrapper
{
    public Person Person { get; set; }
    public string FullName {
            get{
                    return Person.FullName;
            }
    }
}
公共阶层人士
{
公共静态ObservableCollection GetListOfPeople()
{
ObservableCollection ppl=新的ObservableCollection();
对于(int i=0;i<15;i++)
{
如果(i%2==0)
{
SomePerson p=newsomeperson(){Firstname=“First”+i.ToString(),Lastname=“Last”+i.ToString()};
PersonWrapper pw=newpersonwrapper(){Person=p};
ppl.Add(pw);
}
其他的
{
OtherPerson p=newotherPerson(){Firstname=“First”+i.ToString(),Lastname=“Last”+i.ToString();
PersonWrapper pw=newpersonwrapper(){Person=p};
ppl.Add(p);
}
}
返回ppl;
}
}
公共阶层人士
{
公共字符串名{get;set;}
公共字符串Lastname{get;set;}
公共字符串全名
{
得到
{
返回字符串.Concat(Firstname,“,Lastname);
}
}
}
公共类某人:某人
{
}
公共类其他人:个人
{
}
公共类PersonWrapper
{
公众人物{get;set;}
公共字符串全名{
得到{
返回Person.FullName;
}
}
}
我还没有测试代码,但是现在使用了1个类。我知道它很脏,但还是不干净