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