我有一个非常奇怪的问题,我不知道如何调试它。 (旁注:我讨厌创建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类继承的)。
对我来说,这应该与链接中提供的代码一样完全。 但事实并非如此。好像我再也不能丢弃物品了!?
这就是文章中的内容:
这就是我的元素的样子:
对可以重新排序的东西有什么需求吗?本文使用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,我可以移动那些。
答案 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