Операция недействительна, пока ItemsSource используется в качестве исключения - что я делаю неправильно?

Я пытаюсь связать 2D-список объектов с элементом управления контентом. Я получаю исключение, которое я не понимаю. Может ли кто-нибудь прояснить это для меня? (Я попытался установить свойство first.ItemsSource в С#, а также для объекта NationMetrics, который я объявил в коде, - это дало мне то же исключение)

Внешнее исключение:

Добавление значения в коллекцию типа «System.Windows.Controls.ItemCollection» вызвало исключение.

Внутреннее исключение:

Операция недействительна, пока используется ItemsSource. Вместо этого получайте доступ к элементам и изменяйте их с помощью ItemsControl.ItemsSource.

Класс NationMetrics:

public class NationMetrics
{
     List<List<Field>> _Nations = new List<List<Field>>();

     public List<List<Field>> Nations { get { return _Nations; } set { _Nations = value; } }

}

Вот фрагмент из моего MainWindow.xaml, где запускается исключение

<Grid>
    <ItemsControl x:Name="first" ItemTemplate="{DynamicResource DataTemplate_Level1}" ItemsSource="{Binding Path=Nations, Source={StaticResource nationMetric}}" />
</Grid>

Вот фрагмент из моего Window.Resources, который определяет нациюMetric

<local:NationMetrics x:Name="nm" x:Key="nationMetric" />

person economistdolly    schedule 13.06.2012    source источник


Ответы (1)


Вы можете попробовать что-то вроде этого:

<Window.Resources>
    <DataTemplate x:Key="inner">
                    <TextBlock Content="{Binding}"/>
    </DataTemplate>

<DataTemplate x:Key="outer">
    <ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource inner}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</DataTemplate>

</Window.Resources>

<ItemsControl x:Name="itemControl" ItemsSource="{Binding Path=Nations, Source={StaticResource nationMetric}}" ItemTemplate="{DynamicResource outer}">

Это в основном определяет, что в списке есть список, и выполняет привязку соответствующим образом. Я не пробовал, но я думаю, что это подход!

Другие источники:

WPF: как создать панель управления настраиваемыми элементами?

Привязка двухмерной коллекции к некоторому элементу управления

person SalGad    schedule 14.06.2012
comment
Хм... исходный шаблон xaml, который у меня был, был <DataTemplate x:Key="DataTemplate_Level1"> <ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource DataTemplate_Level2}"> <ItemsPanelTemplate> <StackPanel Orientation="Horizontal"/> </ItemsPanelTemplate> </ItemsControl> </DataTemplate> <DataTemplate x:Key="DataTemplate_Level2"> <TextBlock Text="{Binding}" /> </DataTemplate> Ваш работал - нужно ли объявлять внутренний перед внешним? - person economistdolly; 14.06.2012
comment
XAML, HTML, CSS и т. д. - все императивные/декларативные языки. Это означает, что код читается сверху вниз и измененные переменные не влияют на другие зависимые переменные. Так что да, это будет означать, что порядок объявления ресурсов играет роль в конечном результате. Подробнее о декларативных языках программирования: en.wikipedia.org/wiki/Declarative_programming. Я рад, что это сработало! :) - person SalGad; 14.06.2012