Как я могу создать средство доступа к индексу для свойства List <T>, которое у меня есть в пользовательском классе? - PullRequest
2 голосов
/ 26 июля 2011

Вот пример:

    /// <summary>
    /// Collection of SednaTreeViewItems used to populate the SednaTreeView.
    /// </summary>
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public List<SednaTreeViewItem> TreeNodes
    {
        get { return treeNodes; }
        set 
        {
            ultraTree.Nodes.Clear();
            treeNodes = value;
            foreach (var item in treeNodes)
            {
                UltraTreeNode node = new UltraTreeNode(item.ValueMember, item.DisplayMember);
                ultraTree.Nodes.Add(node);
            }

            if (treeNodes.Count() > 0)
                ultraTree.ActiveNode = ultraTree.Nodes[0];
        }
    }

    /// <summary>
    /// SednaTreeViewItem that is currently selected in the SednaTreeView.
    /// </summary>
    public SednaTreeViewItem SelectedItem
    {
        get 
        {
            if (ultraTree.SelectedNodes != null)
            {
                var node = ultraTree.SelectedNodes[0];
                SednaTreeViewItem item = new SednaTreeViewItem(node.Key, node.Text);
                return item;
            }
            else
                return null;                
        }

        set 
        {
            ultraTree.ActiveNode = ultraTree.Nodes[value.ValueMember];
        }
    }

Я бы хотел использовать свой контроль таким образом. Например, кто-то хочет установить выбранный узел представления дерева во время выполнения, я хотел бы что-то вроде:

treeViewInvestors.SelectedItem = treeViewInvestor.TreeNodes[userIdKey];

Где userIdKey - это уникальный ключ, который уже находится за кулисами.

В принципе, есть ли способ создать индексатор "[]" для моего свойства?

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Если доступным свойством коллекции узлов является List (в котором уже есть индексатор типа int), и вам нужен индексатор другого типа, то вы можете представить коллекцию treenode как подкласс списка, который имеет другой тип индексатор:

public class NodeList : List<Node>
{
   public TNode this[Key key] 
   {
       get { return nodes.Where(n => n.Key == key).SingleOrDefault(); }
   }
}

Тогда вы можете получить доступ к обоим видам индекса

var nodeByKey = treeViewInvestor.TreeNodes[key];
var nodeByIndex = treeViewInvestor.TreeNodes[index].
2 голосов
/ 26 июля 2011

Реализация индексатор свойство типа:

public SednaTreeViewItem this[int index]//or public T this[int index]
{
   get { return ultraTree[index]; }
   set { ultraTree[index] = value; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...