Как реализовать пользовательскую группировку в ListBox WPF?C#

Место общения программистов C#
Ответить
Anonymous
 Как реализовать пользовательскую группировку в ListBox WPF?

Сообщение Anonymous »

Можно ли реализовать «индивидуальную» группировку для ListBox без использования CollectionView и CollectionViewSource?
Заранее прошу прощения за мой английский и если я недостаточно подробно описал проблему .
У меня есть простая реализация MVVM с коллекцией, которая загружает сгруппированные объекты. Я также использовал DynamicData (https://dynamic-data.org/) для работы с коллекциями. Ниже приведен весь код приложения:

Код: Выделить всё

public class ChatMessage
{
public long Id { get; set; }
public long Sender { get; set; }
public long Receiver { get; set; }
public string Content { get; set; }
public DateTime Timestamp { get; set; }
public bool Read { get; set; }
public bool Delivered { get; set; }
}

Код: Выделить всё

public class ChatViewModel : AbstractNotifyPropertyChanged
{
private readonly SourceCache _sourceList = new SourceCache(m => m.Id);

public ObservableCollectionExtended GroupedMessages { get; }  = new ObservableCollectionExtended();

public ChatViewModel()
{
// Load test messages
GetTestMessages();

_sourceList
.Connect()
.Group(msg => msg.Timestamp.Date)
.Transform(group => new GroupAdapter(group))
.Bind(GroupedMessages)
.Subscribe();
}

private void GetTestMessages()
{
var messages = new[]
{
new ChatMessage { Id = 1, Sender = 1, Receiver = 2, Content = "Hi!", Timestamp = DateTime.Now.AddDays(-1) },
new ChatMessage { Id = 2, Sender = 2, Receiver = 1, Content = "Hi, how are you ?", Timestamp = DateTime.Now.AddDays(-3).AddHours(1) },
new ChatMessage { Id = 3, Sender = 1, Receiver = 2, Content = "I'm fine!", Timestamp = DateTime.Now },
new ChatMessage { Id = 4, Sender = 2, Receiver = 1, Content = "Nice!", Timestamp = DateTime.Now },
};

foreach (var message in messages)
_sourceList.AddOrUpdate(message);
}
}

Код: Выделить всё

public class GroupAdapter : IGrouping
{
private readonly IGroup _group;

public GroupAdapter(IGroup group)
{
_group = group;
}

public DateTime Key => _group.Key;

public IEnumerator GetEnumerator() => _group.Cache.Items.GetEnumerator();

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
Из-за проблемы с утечкой памяти при использовании CollectionView (https://github.com/dotnet/wpf/issues/60 ... h132836292) у меня возник следующий вопрос: так ли это? Можно ли реализовать «индивидуальную» группировку для ListBox?
Как видно выше, я реализовал интерфейс IGrouping в GroupAdapter, надеясь, что это поможет. Однако я столкнулся со следующими проблемами:
  • Заголовок группы не отображается.
  • Если к одной группе принадлежит несколько объектов, отображается только первый.
Результат:

Изображение

Что я делаю неправильно? Буду признателен за любую помощь.

Подробнее здесь: https://stackoverflow.com/questions/791 ... istbox-wpf
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»