在Silverlight中使用UIElements作为ListBox的ItemsSource

时间:2009-11-05 12:22:06

标签: wpf silverlight data-binding itemssource uielement

我注意到如果你有任何来自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,与其他任何对象一样?或者我错过了什么?

2 个答案:

答案 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和所有基本控件这样的东西在两个地方的实现中都有很大不同。