数据绑定时获取Listbox的ItemContainer

时间:2008-09-12 18:11:28

标签: silverlight

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

我正在尝试在取消选择特定大小并选择为可变大小时重新调整列表框项目的大小。我还想获得动画所选项目的相对位置。增长到可变大小并得到相对的消遣是我需要进入列表框项目的原因。

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

4 个答案:

答案 0 :(得分:2)

有一种方法可以获得包含项目的UIElement的面板以及项目到UIElements的映射。你必须从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;
        }
    }

这有点像hackish,但它运作得很好。

答案 1 :(得分:0)

如果要将非UI元素添加到列表框(例如字符串或非UI数据对象),那么这可能非常困难。但是,如果在将项目添加到列表框之前将其包装在某种FrameworkElement派生对象中,则可以使用TransformToVisual获取相对大小,并使用“高度”和“宽度”来设置项目的大小。

通常,您可以将对象包装在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并设置大小并获取相对位置。如果您需要原始对象,只需获取项目内容属性的值。

答案 2 :(得分:0)

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

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

我找到了这个解决方案here

答案 3 :(得分:0)

更新silverlight 5。

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

现在支持RelativeSource AncestorType,使这更容易。