Может ли кто-нибудь из этого кода понять, почему строка ItemsSource получает

Коллекция элементов должна быть пустой раньше с помощью ItemsSource.

Ошибка? Большинство решений, которые я нашел, указывают на плохо составленный XAML, например дополнительный элемент и т. д., которого у меня, похоже, нет. Когда я достаю

ItemsSource = "{обязательные клиенты}"

Он работает без ошибок (но, конечно, не отображает мой список клиентов).

Таким образом, 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"
    />
14
Edward Tanguay 22 Апр 2009 в 15:32
Просто упоминание искаженного XAML помогло мне
 – 
stambikk
6 Окт 2017 в 03:19

3 ответа

Лучший ответ

Вы пытаетесь установить ItemsSource для ItemsControl, но у вас уже есть дети. Что из этих двух должно применяться? Кнопка, которую вы помещаете в ItemsControl, или коллекцию, которую вы передаете ему как ItemsSource? Сообщение об ошибке вполне разумно.

Вам придется либо удалить кнопку из ItemsControl, либо удалить атрибут ItemsSource. Вы не можете одновременно вставлять элементы и устанавливать ItemsSource.

11
Joey 22 Апр 2009 в 15:36
1
Та же ошибка произойдет, если вы забыли какой-либо текст в элементе XML вашего элемента управления: <ComboBox ItemsSource="{Binding Customers}">This makes it fail</ComboBox>.
 – 
Marcel Gosselin
14 Янв 2011 в 19:12

В вашем ItemsControl есть кнопка. Поскольку в ItemsControl уже есть элемент, он не позволяет вам установить его свойство ItemsSource.

Переместите объявление Button вниз под закрывающим тегом </ItemsControl>.

3
Matt Hamilton 22 Апр 2009 в 15:36

Вы смотрели на этот вопрос? Вроде ответ на вашу проблему.

«Перед использованием ItemsSource коллекция элементов должна быть пустой».

1
Community 23 Май 2017 в 13:27