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

时间:2010-11-02 08:47:00

标签: silverlight silverlight-4.0 silverlight-toolkit

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

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

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

考虑以下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(此处为“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;
        }

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

正如你所看到的,我返回一个元素的ObservableCollection,每个元素都有一个Label属性(显然它们都是从Element类继承的)。

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

这就是文章中的内容:

alt text

这就是我的元素的样子:

alt text

对可以重新排序的东西有什么需求吗?本文使用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
    {

    }

WTF? 您似乎只能重新排序具有特定类型的元素,并将其声明为ObservableCollection上的type-parameter。因此,如果我声明它包含“Person”对象并混合Person-objects而不是SomePerson和OtherPerson,我可以移动那些

3 个答案:

答案 0 :(得分:5)

我遇到了同样的问题并且进行了更多挖掘。继承了我的解决方案:http://cjbhaines.wordpress.com/2011/07/09/silverlight-listboxdragdroptarget-why-cant-i-drop-it-there/

答案 1 :(得分:2)

我有同样的问题并做了几次测试。我的结论是,这不是用户生成的错误,而是工具包中的错误。因此,我已经提出了一个问题并将其发布给了silverlight团队。请将问题投票,以便我们快速得到答复。 http://silverlight.codeplex.com/workitem/8480

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

答案 2 :(得分:1)

我也想到了一个解决方案,我知道它是一个肮脏的解决方案,但它可以解决问题:

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

我还没有测试过代码,但现在有1个类使用过。我知道它很脏,但它仍然无法解决问题。我不知道您的项目可能有帮助,但对于我的项目,这个解决方案将带来很多工作。所以希望这个问题能够快速解决@codeplex

相关问题