Я пытаюсь улучшить проект Winforms, где строки с данными можно хранить в свойстве Tag ListViewItems. Когда для таблицы данных делается рефакторинг для List (или фактически для классов, содержащих списки), было бы очень полезно, если бы я мог сделать свойство Tag универсальным, используя подкласс ListView.
В лучшем из миров, я бы хотел, чтобы свойство Tag было заменено общедоступным T Tag {get; set;}, который оборачивает base.Tag и бросает его.
Вторым лучшим вариантом будет Obsoleting Tag и предоставление нового свойства, такого как TypedTag, работающего, как указано выше.
Я думаю, что это потребовало бы создания подклассов или составной агрегации по крайней мере ListView, ListViewItemCollection, SelectedListViewItemCollection и ListViewItem, и я не уверен, как это сделать.
Короче говоря:
ListView<Employee> lvwEmployees;
должно привести к тому, что это станет возможным:
Employee selected = lvwEmployees.SelectedItems[0].TypedTag;
И дать ошибку компиляции для этого:
DataRow selected = lvwEmployees.SelectedItems[0].TypedTag;
Возможно ли это? Это уже сделано?
Проект - это dotnet 2.0, но я думаю, что постараюсь обновить его, если это поможет.
РЕДАКТИРОВАТЬ: Оказывается, что аргумент конструктора владельца - это все, что определенная коллекция должна подключить к внутренней коллекции. Отсюда следующие работы:
ListView a = new ListView();
a.Items.Add("Hello");
Assert.AreEqual(1, new ListView.ListViewItemCollection(a).Count);
Это упрощает создание универсального тегового ListView. Я выложу полное решение позже. :)
EDIT2: вот решение:
http://thecarlr.blogspot.com/2010/11/generic-listview.html
EDIT3: для поддержки дизайнера просто добавьте неуниверсальный подкласс и используйте его.
Пример: Если вы намеревались использовать ListView в форме, создайте ListViewEmployee: ListView в другом файле и используйте ListViewEmployee в форме.
Самый простой способ добавить один из этих списков - добавить в форму обычный список и затем изменить его тип в исходных файлах. (И если вы не знаете, где он объявлен или создан, вместо этого выясните или используйте обычный просмотр списка.)