c# - implementar - mvvm beginner tutorial
¿Por qué este XAML obtiene el error: la colección de elementos debe estar vacía antes de usar ItemsSource? (3)
¿Puede alguien invocar de este código por qué la línea ItemsSource obtendría un
La colección de elementos debe estar vacía antes de usar ItemsSource.
¿error? La mayoría de las soluciones que he encontrado apuntan a XAML mal compuesto, por ejemplo, un elemento extra, etc. que no parece tener. Cuando salgo
ItemsSource = "{Clientes vinculantes}"
se ejecuta sin un error (pero, por supuesto, no muestra mi lista de clientes).
Clientes se define así en ViewModel y tiene 3 CustomerViewModels en él:
Customer[] customers = Customer.GetCustomers();
IEnumerable<CustomerViewModel> customersViewModels = customers.Select(c => new CustomerViewModel(c));
this.Customers = new ReadOnlyCollection<CustomerViewModel>(customersViewModels.ToArray());
¿Alguna sugerencia de dónde mirar?
<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>
RESPONDER:
De hecho, he malformado XAML, simplemente lo pasé por alto, el botón debería estar fuera de 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"
/>
Está intentando establecer ItemsSource de ItemsControl pero ya tiene 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.
Tendría que eliminar el botón de ItemsControl o eliminar el atributo ItemsSource. No puede insertar elementos y establecer ItemsSource al mismo tiempo.
Tus ItemsControl tiene un botón. 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>
.
¿Has mirado esta pregunta? Parece ser la respuesta a tu problema.
"La colección de elementos debe estar vacía antes de usar ItemsSource".