2009-04-22 15 views
11

¿Alguien puede evocar de este código por qué la línea ItemsSource sería conseguir un error dePor qué es esto XAML consiguiendo el error: colección de artículos debe estar vacío antes de usar ItemsSource

Items collection must be empty before using ItemsSource.

? La mayoría de las soluciones que he encontrado apuntan a XAML mal compuesto, p. un elemento extra, etc. que no parezco tener. Cuando saco

ItemsSource="{Binding Customers}"

funciona sin un error (pero, por supuesto, no muestra mi lista de clientes).

clientes es thusly define en el modelo de vista y tiene 3 CustomerViewModels en ella:

Customer[] customers = Customer.GetCustomers(); 
IEnumerable<CustomerViewModel> customersViewModels = customers.Select(c => new CustomerViewModel(c)); 
this.Customers = new ReadOnlyCollection<CustomerViewModel>(customersViewModels.ToArray()); 

Cualquier sugerencia de dónde buscar?

<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> 

RESPUESTA:

que tienen efectivamente XAML mal formado, simplemente se pasa por alto que, El botón debe estar fuera del 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" 
    /> 
+0

acaba de mencionar XAML malformación me ayudó a – stambikk

Respuesta

9

Usted está tratando de establecer el ItemsSource los ItemsControl pero ya tienes hijos. ¿Cuál de los dos debería aplicar? ¿El botón que coloca dentro de ItemsControl o la colección que está entregando como ItemsSource? El mensaje de error es perfectamente razonable.

Debería quitar el botón de ItemsControl o eliminar el atributo ItemsSource. No puede insertar elementos y establecer ItemsSource al mismo tiempo.

+1

El mismo error se producirá si se olvidó cualquier texto dentro del elemento XML de tu control: ' Esto hace que falle '. –

2

Tus ItemsControl tiene un botón dentro. Como ya hay un elemento en ItemsControl, no le permite establecer su propiedad ItemsSource.

Mueva la declaración del botón hacia abajo debajo de la etiqueta de cierre </ItemsControl>.

Cuestiones relacionadas