2009-04-22 3 views
11

Quelqu'un peut-il conjure de ce code pourquoi la ligne ItemsSource serait d'obtenir unPourquoi est-ce XAML obtenir l'erreur: la collecte des objets doit être vide avant d'utiliser ItemsSource

Items collection must be empty before using ItemsSource.

erreur

? La plupart des solutions que j'ai trouvées pointent vers XAML mal-composé, par ex. un élément supplémentaire, etc., que je ne semble pas avoir. Quand je sors

ItemsSource="{Binding Customers}"

il fonctionne sans erreur (mais bien sûr n'affiche pas ma liste de clients).

clients est définit thusly dans le ViewModel et a 3 CustomerViewModels en elle:

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

toute suggestion d'où chercher?

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

RÉPONSE:

J'ai bien ai malformé XAML, juste a oublié, le bouton doit être en dehors du 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

vient de mentionner XAML malformé m'a aidé – stambikk

Répondre

9

Vous essayez de définir la ItemsSource de le ItemsControl mais vous avez déjà des enfants. Lequel de ces deux devrait s'appliquer? Le bouton que vous mettez dans ItemsControl ou dans la collection que vous lui transmettez en tant que ItemsSource? Le message d'erreur est parfaitement raisonnable.

Vous devez supprimer le bouton de ItemsControl ou supprimer l'attribut ItemsSource. Vous ne pouvez pas insérer d'éléments et définir ItemsSource en même temps.

+1

La même erreur se produit si vous avez oublié tout texte dans votre élément XML de commande: ' Cela fait échouer'. –

2

Votre ItemsControl a un bouton dedans. Comme il y a déjà un élément dans ItemsControl, il ne vous permet pas de définir sa propriété ItemsSource.

Déplacez la déclaration Button vers le bas sous la balise de fermeture </ItemsControl>.

Questions connexes