Взлом, о котором я говорю выше, НЕ РЕКОМЕНДУЕТСЯ. Однако, если вы ДЕЙСТВИТЕЛЬНО хотите, чтобы отображались пустые группы, то вам просто нужно делегировать код добавления отдельному служебному методу, который проверяет, является ли группа пустой. Если это так, то он добавляет его в группу «по умолчанию» (так, по крайней мере, он появляется), пока вы не добавите в него элемент.
public static void AddGroup(this ListView lv, ListViewGroup lg)
{
if (lg.Items.Count > 0 || lv.Items.Cast<ListViewItem>().Any(tg => tg.Group == lg))
lv.Groups.Add(lg);
else
{
var item = lv.Items.Add(lg.Header);
item.Tag = lg;
}
}
public static void AddItem(this ListView lv, ListViewItem li, string groupKey) // Could also take ListViewGroup here...
{
if (lv.Groups[groupKey] == null && lv.Items.ContainsKey(groupKey))
{
lv.Groups.Add((ListViewGroup)lv.Items[groupKey].Tag);
lv.Items.RemoveByKey(groupKey);
}
lv.Items.Add(li);
li.Group = lv.Groups[groupKey];
}
public static void AddItem(this ListView lv, ListViewItem li, ListViewGroup lg)
{
lv.AddItem(li, lg.Header);
}
Еще одно предупреждение, НЕ РЕКОМЕНДУЕТСЯ. Это довольно много накладных расходов, и на самом деле не стоит проблем (IMO). Но эй, каждому свое. Этот код полностью не проверен, и просто выдает его на тот случай, если вам действительно нужно, чтобы это работало (чего никогда не должно быть, лучше искать альтернативы). Хуже всего то, что объявление Group в основном находится внутри самого ListItem, так что вы можете легко изменить группу.
Последнее предупреждение, НЕ РЕКОМЕНДУЕТСЯ.
Edit: я изменил код выше, чтобы быть методами расширения объектов ListView, таким образом, у вас есть прямой доступ к ListView из методов. Каждый раз, когда вы добавляете группу, вы просто вызываете listView.AddGroup
, добавляя элемент, который вы можете использовать из методов listView.AddItem
. Это противоположно listView.Items.Add
и listView.Groups.Add
методам. Следует помнить одну вещь: вам не нужно назначать элементы группам, а вместо этого назначать группы только элементам. Это позволяет переключать элементы между группами, изменяя ссылку, вместо того, чтобы удалять / добавлять ссылки между группами. Это также предполагает, что вы объявили Header
ListItemGroup такой же, как Key
(другими словами, new ListItemGroup("HeaderText" /*KEY*/, "HeaderText" /*HEADER*/)
. В противном случае вам просто нужно изменить логику в AddItem
для ссылки правильное значение (обычно Name
).