【问题标题】:ObservableCollection auto-index [duplicate]ObservableCollection 自动索引 [重复]
【发布时间】:2010-09-01 17:45:08
【问题描述】:

我有一个要放置在 ObservableCollection 中的项目列表,然后我将其数据绑定到在 XAML 中创建的数据网格 UI。显示的列之一是列表中项目的索引。目前,我正在创建一个属性并绑定到它。但是,当我需要从列表中更新/添加/删除项目时,这会产生大量工作——我必须检查所有受影响的项目并更改它们的属性。我的问题是:有没有办法在 UI 中自动显示集合中项目的索引?

【问题讨论】:

  • 这行得通。您需要绑定到 DataGridRow AlternationIndex。
  • 这看起来正是我所需要的。但是,我使用的特定控件是 RadTreeListView,我似乎无法获得 AlternationIndex。有什么想法吗?
  • AlternationIndex 是 ItemsControl 拥有的继承的附加属性,可以在 XAML 中使用 ItemsControl.AlternationIndex 访问任何元素。 AlternationCount 是 ItemsControl 上的一个属性,应该显示在 RadTreeListView 上(它应该派生自 ItemsControl)。
  • 你是对的。不幸的是,即使将 AlternationCount 设置为一个相当高的数字,AlternationIndex 似乎对于所有项目都是 0。

标签: c# wpf xaml observablecollection


【解决方案1】:

您可以使用转换器进行绑定,您的转换器将在其中执行查找以查找索引。然后,无论您的项目位于集合中的哪个位置,您都将拥有正确的索引。

【讨论】:

  • 所以我实现了这个,但是当从列表中添加/删除项目时不会自动调用转换器。例如,当我删除一个项目时,它下面的所有项目都会保留它们的旧索引值。
  • 听起来它没有在集合更改事件上更新,听起来你需要附加一个处理程序,并在其中强制更新。
【解决方案2】:

您是否考虑过在顶部实现视图模型?然后,您可以根据需要显示您的 ObservableCollection 并在幕后实现它

public class IndexedObject
{

    private object _rootObject;
    private int _index;

    public IndexedObject(object rootObject, int index)
    {
        _rootObject = rootObject;
        _index=index;
    }

    public string Value
    {
        get
        {
            return _rootObject.ToString();
        }
    }

    public int Index
    {
        get
        {
            return _index;
        }
    }
}

然后您可以在类或显示您的 ObservableCollection 的类上实现此属性

    ObservableCollection<object> _yourCollection;

    public IEnumerable<IndexedObject> IndexedObjects
    {

        get
        {
            for (int i = 0; i < _yourCollection.Count; i++)
            {
                yield return new IndexedObject(_yourCollection[i], i);
            }
        }
    }

然后,您可以让 ObservableCollection collectionchanged 事件通知程序您的 IndexedObjects 属性已更改。然后,您可以绑定到 IndexedObjects 属性并使用 Index 属性,而不管下面的实际集合是什么样的:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2011-12-30
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多