1

有没有办法获取列表框中所选项目的 ItemContaner?在 Silverlight 2.0 Beta 1 中我可以,但容器隐藏在 Silverlight 2.0 的 Beta 2 中。

当未选择特定大小以及选择可变大小时,我正在尝试调整列表框项目的大小。我还想获取动画所选项目的相对位置。增长到可变大小并获得相对热情是我需要进入列表框项目的原因。

我应该澄清我没有明确地将项目添加到列表框中。我在 xaml 和 DataTemplates 中使用数据绑定。我无法访问的是所选项目的 DataTemplate 的 ItemContainer。

4

4 回答 4

2

有一种方法可以获取包含项目的 UIElement 和项目到 UIElements 的映射的 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

If you are adding non-UI elements to the listbox (such as strings or non-UI data objects), then this is probably pretty difficult. However if you wrap your items in some sort of FrameworkElement-derived object before adding them to the listbox, you can use TransformToVisual to get the relative size and use Height and Width to set the size of the item.

In general you can wrap your objects in a ContentControl like the following. Instead of:

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

Do this:

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

Now when you get _ListBox.SelectedItem you can cast it to ContentControl and set the size and get the relative position. If you need the original object, simply get the value of the item's Content property.

于 2008-09-17T19:57:37.480 回答
0

看来您可以使用相对绑定从 ItemTemplate 获取 Item Container。

<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 回答