Binding CollectionViewSource to Listbox ItemSource
Поставили задачу группировать данные в wpf форме.По началу, когда я пытался сделать для Listbox, выскакивало сообщение
Операция недопустима, когда ItemsSource используется. Вместо этого получите доступ и измените элементы с помощью ItemsControl.ItemsSource.
XAML-код был следующий:
<UserControl x:Class="CollectingSystemData.Views.ChooseIndicatorsView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CollectingSystemData.Views"
xmlns:vm="clr-namespace:CollectingSystemData.ViewModels" d:DataContext="{d:DesignInstance Type=vm:ChooseIndicatorsViewModel}"
mc:Ignorable="d"
d:DesignHeight="600" d:DesignWidth="400"
Height="600" Width="375"
Background="White">
<UserControl.Resources>
<vm:ChooseIndicatorsViewModel x:Key="ChooseIndicatorsViewModel"/>
</UserControl.Resources>
<StackPanel DataContext="{StaticResource ChooseIndicatorsViewModel}">
<TextBlock FontSize="24" Margin="0,15,0,20">
<Bold>Собираемые показатели</Bold>
</TextBlock>
<ListBox ItemsSource="{Binding AllIndicators}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsSelected}" Content="{Binding Name}" Command="{Binding DataContext.SelectModuleCommand, RelativeSource={RelativeSource AncestorType=ListBox}}" CommandParameter="{Binding}"/>
</DataTemplate>
</ListBox.ItemTemplate>
<GroupStyle>
</GroupStyle>
</ListBox>
<Button Content="Начать сбор данных" Command="{Binding CollectionDataCommand}"/>
</StackPanel>
</UserControl>
Код ViewModel небольшой, просто объявлены свойства и в конструкторе задается значение для свойства AllIndicators:
public class ChooseIndicatorsViewModel : ViewModelBase
{
public ChooseIndicatorsViewModel()
{
ModulesController = new ModulesController();
ModulesController.LoadModules();
AllIndicators = new ObservableCollection<Indicator>();
foreach (IPlugin module in ModulesController.Modules)
{
foreach(Indicator indicator in module.Indicators)
{
AllIndicators.Add(indicator);
}
}
SelectedIndicators = new List<Indicator>();
CollectionDataCommand = new LambdaCommand(OnCollectionData, CanCollectionData);
SelectModuleCommand = new LambdaCommand(OnSelectModule);
}
private void OnSelectModule(object parameter)
{
//код опущен
}
private bool CanCollectionData(object parameter)
{
//код опущен
}
private void OnCollectionData(object parameter)
{
//код опущен
}
public ModulesController ModulesController { get; }
public ICommand CollectionDataCommand { get; }
public ICommand SelectModuleCommand { get; }
public ObservableCollection<Indicator> AllIndicators { get; }
public List<Indicator> SelectedIndicators { get; }
public string Group { get; set; } = "test";
}
Далее нашел в интернете такой элемент как CollectionViewSource, он используется как ресурс и далее идет его привязка к ItemSource
<UserControl.Resources>
<vm:ChooseIndicatorsViewModel x:Key="ChooseIndicatorsViewModel"/>
<CollectionViewSource x:Key="GroupCollectionViewSource" Source="{Binding AllIndicators}">
<!--<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Group"/>
</CollectionViewSource.GroupDescriptions>-->
</CollectionViewSource>
</UserControl.Resources>
....
<ListBox ItemsSource="{Binding Source={StaticResource GroupCollectionViewSource}}"/>
Остальное содержимое Listbox осталось прежним. Но данные все-равно не выводятся. Хотя если делать без всяких группировок, а просто привязать AllIndicators из ChooseIndicatorsViewModel данные спокойно выводились:
Подскажите, что я не так сделал?