通过附加属性获取列表框项目索引

时间:2009-01-12 17:33:03

标签: c# wpf

使用this posting作为参考,我试图通过实现附加属性来显示Listbox项的索引。我将是第一个承认我并不完全理解附加属性如何解决这个问题的人,但我希望在成功实施解决方案后它会变得清晰。在花了无数个小时来解决这个问题后,我正在寻找一些帮助,无论是否通过附属物。此时,它使用默认字符串(“Default”),但似乎没有评估其他函数。这是我到目前为止所做的:

在WPF中:

<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}},
                                                Mode=OneWay, 
                                                Path=(Silhouette_Controls_ThumbnailListbox:ListBoxItemIndex.ItemIndex)}"
                                       TextAlignment="Center"
                                       VerticalAlignment="Bottom" 
                                       HorizontalAlignment="Center" />

C#中的依赖属性类

public class ListBoxItemIndex : DependencyObject
    {
        public static readonly DependencyProperty ItemIndexProperty = 
            DependencyProperty.RegisterAttached(
                "ItemIndex",
                typeof(string),
                typeof(ListBoxItemIndex),
                new PropertyMetadata("Default", new PropertyChangedCallback(OnItemIndexChanged)));

        public static string GetItemIndex(DependencyObject element)
        {
            return (string)element.GetValue(ItemIndexProperty);
        }

        public static void SetItemIndex(DependencyObject element, string value)
        {
            element.SetValue(ItemIndexProperty, value);
        }

        private static void OnItemIndexChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ListBoxItem item = d as ListBoxItem;

            ListBox view = ItemsControl.ItemsControlFromItemContainer(item) as ListBox;

            int index = view.ItemContainerGenerator.IndexFromContainer(item);
        }
    }

1 个答案:

答案 0 :(得分:1)

在这种情况下,我认为附属财产不会对您有所帮助。您附加的属性将始终具有“默认”值,因为我认为您不将该属性设置为其他内容。仅当通过Binding或直接在XAML或代码中修改了ItemIndex属性时,才会调用OnItemIndexChanged。

我会使用与您在上面发布的链接相同的方式使用值转换器。

MSDN有一个关于创建值逆变器的示例:http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx