1

リストボックスで選択したアイテムのItemContanerにアクセスする方法はありますか?Silverlight 2.0 Beta 1では可能でしたが、Silverlight2.0のBeta2ではコンテナーが非表示になっています。

リストボックスアイテムが特定のサイズに選択されていないとき、および可変サイズに選択されているときに、リストボックスアイテムのサイズを変更しようとしています。また、アニメーション用に選択したアイテムの相対位置を取得したいと思います。可変サイズに成長し、相対的なパッションを取得することが、リストボックスアイテムに到達する必要がある理由です。

リストボックスにアイテムを明示的に追加していないことを明確にする必要があります。xamlとDataTemplatesでデータバインディングを使用しています。アクセスに問題があるのは、選択したアイテムのDataTemplateのItemContainerです。

4

4 に答える 4

2

アイテムの UIElement とアイテムの UIElement へのマッピングを含む Panel を取得する方法があります。ListBox から継承し (これは実際にはどの ItemsControl でも機能します)、PrepareContainerForItemOverride をオーバーライドする必要があります。

protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        base.PrepareContainerForItemOverride(element, item);
        var el = element as FrameworkElement;
        if (el != null)
        {
            // here is the elements's panel:
            _itemsHost = el.Parent as Panel;

            // item is original item inserted in Items or ItemsSource
            // we can save the mapping between items and FrameworElements:
            _elementMapping[item] = el;
        }
    }

これは一種のハックですが、うまく機能します。

于 2008-10-02T12:40:22.397 に答える
0

相対バインディングを使用して、ItemTemplateからItemContainerを取得できるようです。

<TextBlock YourTargetProperty="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBoxItem}}, Mode=OneWay, Path=YourSourceProperty}" />

私はここでこの解決策を見つけました。

于 2009-09-30T22:17:53.293 に答える
0

Silverlight 5 の更新。

              <ListBox ItemsSource="{Binding Properties}">
                 <ListBox.ItemTemplate>
                    <DataTemplate>
                       <TextBlock Text="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" />
                    </DataTemplate>
                 </ListBox.ItemTemplate>

RelativeSource AncestorType がサポートされるようになり、これがより簡単になりました。

于 2012-05-02T04:14:18.370 に答える
0

非 UI 要素 (文字列や非 UI データ オブジェクトなど) をリスト ボックスに追加する場合、これはおそらくかなり困難です。ただし、アイテムをリストボックスに追加する前に何らかの FrameworkElement 派生オブジェクトでアイテムをラップする場合は、TransformToVisual を使用して相対的なサイズを取得し、Height と Width を使用してアイテムのサイズを設定できます。

一般に、次のように ContentControl でオブジェクトをラップできます。それ以外の:

_ListBox.Items.Add(obj0);
_ListBox.Items.Add(obj1);

これを行う:

_ListBox.Items.Add(new ContentControl { Content = obj0 });
_ListBox.Items.Add(new ContentControl { Content = obj1 });

_ListBox.SelectedItem を取得すると、それを ContentControl にキャストし、サイズを設定して相対位置を取得できます。元のオブジェクトが必要な場合は、アイテムの Content プロパティの値を取得するだけです。

于 2008-09-17T19:57:37.480 に答える