0

UIElementSilverlightのアイテムとして派生したものがある場合、オブジェクトはそのままレンダリングされ、および/またはListBoxの設定に注意を払っていないことに気付きました。DisplayMemberPathListBox.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>

Siverlightでは、これにより次の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リフレクターでそのメソッドを見ると、アイテムが の場合、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 はどちらも Microsoft によって異なる方法でコーディングされています。たとえば、依存関係プロパティの多くの機能が Silverlight 3.0 ではまだ不足しています。

今あなたのコードを見るとDisplayMemberPath、シルバーライトでは依存オブジェクトに対して正しく機能していないことを意味しますが、今のところ純粋な clr オブジェクトに対してのみうまく機能します。ただし、Microsoft Connect の Web サイトにバグを投稿すると、更新プログラムが提供される場合があります。

依存関係プロパティは SL 3.0 ではまだ新しいため、SL 4.0 で改善されることを期待しています。リフレクターを使用すると、stackpanel などのすべてのものとすべての基本的なコントロールの実装が両方の場所で大きく異なることがわかります。

于 2009-11-05T18:02:59.317 に答える