0

我注意到,如果您有任何从SilverlightUIElement中的项目派生的东西,ListBox它会按原样呈现对象,并且不会关注DisplayMemberPath和/或的设置ListBox.ItemTemplate

例如,如果您有这样的 XAML:

<ListBox Width="200" Height="300" DisplayMemberPath="Tag">
    <TextBlock Tag="tag1">text1</TextBlock>
    <TextBlock Tag="tag2">text2</TextBlock>
    <TextBlock Tag="tag3">text3</TextBlock>
</ListBox>

在 Silverlight 中,这会产生一个ListBox类似这样的项目:

text1
text2
text3

但是在 WPF 中(我认为这是正确的行为)它按预期列出了标签:

tag1
tag2
tag3

如果我使用不是从 UIElement 继承的对象,一切都会按预期工作:

<ListBox Width="200" Height="300" DisplayMemberPath="[0]">
    <sys:String>abcde</sys:String>
    <sys:String>fgh</sys:String>
</ListBox>

产生:

a
f

有什么方法可以像在 Silverlight 中一样使用UIElements 和任何其他对象一样?ItemsSource还是我错过了什么?

4

2 回答 2

1

看起来问题出PrepareContainerForItemOverride在课堂上的方法中ItemsControlBase。如果您在反射器中查看该方法,您将看到如果项目是 a则不会调用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 并将其设置为实现控件的程序集。

祝你好运!

于 2009-11-05T18:10:49.963 回答
0

Silverlight 和 WPF 都被微软以不同的方式编码,例如,silverlight 3.0 中仍然缺少许多依赖属性的功能

现在查看您的代码,仅意味着DisplayMemberPath在silverlight 中,依赖对象无法正常工作,但目前仅对纯 clr 对象更有效。但是,如果您在 microsoft connect 网站上发布错误,他们可能会提出更新。

依赖属性在 SL 3.0 中仍然是新的,所以我们希望在 SL 4.0 中看到一些改进。如果你使用反射器,你会发现像 stackpanel 和所有基本控件这样的东西在两个地方的实现上都有很大的不同。

于 2009-11-05T18:02:59.317 回答