ListBoxDragDropTarget не будет переупорядочивать элементы, которые используют наследование - PullRequest
4 голосов
/ 02 ноября 2010

У меня очень странная проблема, и я не знаю, как ее отладить.(Примечание: я ненавижу создавать 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который здесь "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 of Element, каждый из которых имеетСвойство метки (и все они, очевидно, наследуются от класса Element).

Для меня это должно работать точно так же, как код, указанный в ссылке.Но это не так.Как будто я больше не могу отбрасывать предметы!?

Вот как это выглядит в статье:

alt text

А вот так это выглядит с моими элементами:

alt text

Есть ли спрос на вещи, которые можно переупорядочить?В статье используются 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
    {

    }

WTF ?!Кажется, вы можете переупорядочивать только те элементы, которые имеют определенный тип , объявленный как параметр типа в ObservableCollection.Таким образом, если я заявляю, что он содержит объекты «Персона» и смешивается в объектах «Персона», а не с SomePerson и OtherPerson, я могу переместить этих .

Ответы [ 3 ]

5 голосов
/ 10 июля 2011

У меня была та же проблема, и я немного покопался. Вот мое решение: http://cjbhaines.wordpress.com/2011/07/09/silverlight-listboxdragdroptarget-why-cant-i-drop-it-there/

2 голосов
/ 07 марта 2011

У меня та же проблема, и я провел несколько тестов. Я пришел к выводу, что это не ошибка пользователя, а ошибка в инструментарии. Поэтому я решил проблему и отправил ее команде Silverlight. Пожалуйста, проголосуйте за вопрос, чтобы мы могли получить быстрый ответ. http://silverlight.codeplex.com/workitem/8480

Пожалуйста, отметьте как ответ, если считаете, что это может помочь.

1 голос
/ 08 марта 2011

Я также подумал о решении, я знаю, что оно грязное, но оно помогает:

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

...