我注意到如果你有任何来自UIElement
的内容作为Silverlight中ListBox
中的项目,它会按原样呈现对象,而不会关注{{1}的设置}和/或DisplayMemberPath
。
例如,如果你有这样的XAML:
ListBox.ItemTemplate
在Siverlight中,这会生成<ListBox Width="200" Height="300" DisplayMemberPath="Tag">
<TextBlock Tag="tag1">text1</TextBlock>
<TextBlock Tag="tag2">text2</TextBlock>
<TextBlock Tag="tag3">text3</TextBlock>
</ListBox>
,其中的项目如下:
ListBox
但是在WPF中(我认为这是正确的行为)它会按预期列出标记:
text1
text2
text3
如果我使用不是从UIElement继承的对象,一切都按预期工作:
tag1
tag2
tag3
产地:
<ListBox Width="200" Height="300" DisplayMemberPath="[0]">
<sys:String>abcde</sys:String>
<sys:String>fgh</sys:String>
</ListBox>
有没有办法在Silverlight中使用a
f
作为UIElement
,与其他任何对象一样?或者我错过了什么?
答案 0 :(得分:1)
看起来问题出在PrepareContainerForItemOverride
类的ItemsControlBase
方法中。如果您在反射器中查看该方法,您将看到如果该项目是UIElement
,那么使用DisplayMemberPath
填充项目的逻辑不会被调用。
如果您想获得所需的行为,则需要继承ListBox
控件并重写此方法并设置您想要在ListBoxItems
上设置的值。
以下是一个例子:
public class MyListBox : ListBox
{
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
if (!object.ReferenceEquals(element, item))
{
ContentControl control = element as ContentControl;
if (control == null || this.ItemTemplate == null)
{
return;
}
control.Content = item;
control.ContentTemplate = this.ItemTemplate;
}
}
}
你需要ItemTemplate
来实现这个目标。实现DisplayMemberPath
属性稍微复杂一些。
<local:MyListBox Width="200" Height="300" DisplayMemberPath="Tag">
<local:MyListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Tag}" />
</DataTemplate>
</local:MyListBox.ItemTemplate>
<TextBlock Tag="tag1">text1</TextBlock>
<TextBlock Tag="tag2">text2</TextBlock>
<TextBlock Tag="tag3">text3</TextBlock>
</local:MyListBox>
不要忘记为本地添加xmlns并将其设置为实现控件的程序集。
祝你好运!答案 1 :(得分:0)
Silverlight和WPF都由microsoft进行了不同的编码,例如,Silverlight 3.0中仍然缺少很多依赖属性的功能
现在查看代码,只是意味着silverlight中的DisplayMemberPath
无法正确处理依赖项对象,但它现在只适用于纯clr对象。但是,如果您在microsoft connect网站上发布错误,他们可能会提出更新。
依赖属性在SL 3.0中仍然是新的,所以我们希望看到SL 4.0有所改进。如果你使用反射器,你会发现像stackpanel和所有基本控件这样的东西在两个地方的实现中都有很大不同。