Почему этот XAML получает ошибку: коллекция элементов должна быть пустой перед использованием ItemsSource
Может ли кто-нибудь вызвать из этого кода, почему строка ItemsSource получит
Коллекция элементов должна быть пустой до с помощью ItemsSource.
ошибка? Большинство решений, которые я нашел, указывают на плохо составленный XAML, например. дополнительный элемент и т.д., которого у меня нет. Когда я вынимаю
ItemsSource = "{Binding Customers}"
он работает без ошибок (но, конечно, не отображает список моих клиентов).
Клиенты определяются таким образом в ViewModel и имеют в нем 3 CustomerViewModels:
Customer[] customers = Customer.GetCustomers();
IEnumerable<CustomerViewModel> customersViewModels = customers.Select(c => new CustomerViewModel(c));
this.Customers = new ReadOnlyCollection<CustomerViewModel>(customersViewModels.ToArray());
Любые предложения о том, где искать?
<UserControl x:Class="TestCommandSink123.View.CustomersView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestCommandSink123"
xmlns:view="clr-namespace:TestCommandSink123.View"
xmlns:vm="clr-namespace:TestCommandSink123.ViewModel"
xmlns:sink="clr-namespace:TestCommandSink123.CommandSinkClasses"
sink:CommandSinkBinding.CommandSink="{Binding}"
>
<UserControl.CommandBindings>
<sink:CommandSinkBinding Command="vm:CustomersViewModel.CloseAllCustomersCommand"/>
</UserControl.CommandBindings>
<DockPanel>
<ItemsControl
DockPanel.Dock="Bottom" ItemsSource="{Binding Customers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<view:CustomerView/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<Button
Command="vm:CustomersViewModel.CloseAllCustomersCommand"
Content="Close All"
Margin="0,0,0,8"
/>
</ItemsControl>
</DockPanel>
</UserControl>
Ответ:
Я действительно исказил XAML, просто упустил из виду, Кнопка должна находиться вне элемента ItemsControl:
<ItemsControl
DockPanel.Dock="Bottom" ItemsSource="{Binding Customers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<view:CustomerView/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button
Command="vm:CustomersViewModel.CloseAllCustomersCommand"
Content="Close All"
Margin="0,0,0,8"
/>
Ответы
Ответ 1
Вы пытаетесь установить ItemsSource элемента ItemsControl, но у вас уже есть дети. Какой из этих двух должен применяться? Кнопка, которую вы ввели в ItemsControl или коллекцию, которую вы передаете в качестве ItemsSource? Сообщение об ошибке вполне разумно.
Вам придется либо удалить кнопку из элемента ItemsControl, либо удалить атрибут ItemsSource. Вы не можете вставлять элементы и устанавливать ItemsSource одновременно.
Ответ 2
В вашем элементе ItemsControl есть кнопка. Поскольку в ItemsControl уже есть элемент, это не позволяет вам установить его свойство ItemsSource.
Переместите объявление кнопки вниз под тегом </ItemsControl>
.
Ответ 3
Вы рассматривали этот вопрос? Это похоже на ответ на вашу проблему.
"Коллекция предметов должна быть пустой перед использованием ItemsSource."