Nie mogę sobie wyobrazić, że to rozwiązanie jest gotowe do użycia, ponieważ próbujesz przestawić grupy. Zrobiłem przykład, ale nie mogę go zmienić rozmiar szerokość kolumn w itemsarea ale w nagłówku bez użycia separatory:
Code-Behind
public partial class Window1 {
public Window1() {
InitializeComponent();
this._items.Add(new Item { Name = "one", DateTime = DateTime.Today });
this._items.Add(new Item { Name = "two", DateTime = DateTime.Today.Subtract(new TimeSpan(1, 0, 0, 0)) });
this._items.Add(new Item { Name = "three", DateTime = DateTime.Today.Subtract(new TimeSpan(1, 0, 0, 0)) });
this._items.Add(new Item { Name = "four", DateTime = DateTime.Today.Add(new TimeSpan(1, 0, 0, 0)) });
this._items.Add(new Item { Name = "five", DateTime = DateTime.Today.Add(new TimeSpan(1, 0, 0, 0)) });
this.DataContext = this;
}
private ObservableCollection<Item> _items = new ObservableCollection<Item>();
public ObservableCollection<Item> Items => _items;
}
public abstract class ViewModelBase : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) {
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class Item : ViewModelBase {
private string _name;
private DateTime _dateTime;
public string Name {
get {
return this._name;
}
set {
if (value == this._name)
return;
this._name = value;
this.OnPropertyChanged();
}
}
public DateTime DateTime {
get {
return this._dateTime;
}
set {
if (value.Equals(this._dateTime))
return;
this._dateTime = value;
this.OnPropertyChanged();
}
}
}
Grupowanie z zasobów
<Window.Resources>
<CollectionViewSource x:Key="CollectionViewSource" Source="{Binding Items}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="DateTime" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
ListBox
<ListBox ItemsSource="{Binding Source={StaticResource CollectionViewSource}}" Width="400" Height="200">
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<GridViewColumnHeader Content="{Binding Name}"/>
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.Panel >
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</ListBox.GroupStyle>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
<Setter Property="VerticalContentAlignment" Value="Stretch"></Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="DarkGray" BorderThickness="0,0,1,0" Margin="-6,-2,-6,-2">
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Najważniejszym elementem tego rozwiązania jest użycie GridViewColumnHeader
jako nagłówka dla właściwości GroupStyle.
Prawdopodobnie lepszym rozwiązaniem może być zmiana ListBoxa na ListView i ustawienie ListView na View
-Property na GridView
. Wymaga to jednak zmiany struktury danych.
Uwaga
grupowanie ListBox nigdy nie miał do wykonania zadanie, które starają się zrobić. Domyślnym sposobem z listbox i grupowania jest mieć ekspandery w obszarze zawartości pola listy w sposób opisany here
Nie jestem ekspertem, ale czy nie powinieneś także dodać 'Separator' do' ItemsPanelTemplate'? –
Proszę podać pełną XAML i kod. Łatwiej będzie go zwiększyć i znaleźć empiryczne rozwiązanie. – Kilazur