MVVM WPF ObservableCollection: ошибки добавления элементов, привязка ItemsSource

У меня проблемы с добавлением элементов в ObservableCollection при использовании списка с ItemsSource. Я добавляю фиктивные данные для тестирования в свой конструктор моделей просмотра.

Моя модель просмотра:

public class KabaDeviceListViewModel : KabaBase
{

    private ObservableCollection<KabaDeviceDetailViewModel> _details;

    public ObservableCollection<KabaDeviceDetailViewModel> KabaDevices
    {
        get { return _details; }
        set 
        {
            if (value != _details)
            {
                _details = value;
                OnPropertyChanged("KabaDevices");
            }
        }
    }


    public KabaDeviceListViewModel()
    {

        ObservableCollection<KabaDeviceDetailViewModel> _details = new ObservableCollection<KabaDeviceDetailViewModel>();

        KabaDevice kd1 = new KabaDevice("localhost A", "127.0.0.1", true);
        KabaDeviceDetailViewModel dvm = new KabaDeviceDetailViewModel(kd1);
        _details.Add(dvm);

        KabaDevice kd2 = new KabaDevice("localhost B", "127.0.0.1", true);
        KabaDeviceDetailViewModel dvm2 = new KabaDeviceDetailViewModel(kd2);
        _details.Add(dvm2);

        this.KabaDevices = _details;
    }
}

Пока все хорошо, но здесь, в ItemsSource списка, возникает ошибка в коде XAML. Я не понимаю, что делаю неправильно. Я использую VS2010 и .NET 4.0.

<UserControl x:Class="KabaTest.View.KabaDeviceListView"
         ...
         xmlns:myViewModels="clr-namespace:KabaTest.ViewModel"
         xmlns:myViews="clr-namespace:KabaTest.View">
<UserControl.DataContext>
    <myViewModels:KabaDeviceListViewModel/>
</UserControl.DataContext>
<Grid>
    <ListBox Margin="5" 
             ItemsSource="{Binding Path=KabaDevices, Mode=TwoWay}" >
             ScrollViewer.HorizontalScrollBarVisibility="Disabled" >
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel IsItemsHost="True" Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate DataType="{x:Type myViewModels:KabaDeviceDetailViewModel}" >
                <myViews:KabaDeviceDetailView DataContext="{Binding }"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

The InnerException at ItemsSource is : {"Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead."}. Thanks for your help!


person user2135342    schedule 02.10.2013    source источник
comment
Есть ли в вашем приложении какой-либо другой код, который пытается добавлять / удалять элементы непосредственно в / из ListBox, а не с помощью свойства KabaDevices?   -  person Peter Holmes    schedule 02.10.2013


Ответы (1)


В вашем конструкторе может быть проблема. Вы назначаете поле поддержки _details общедоступному свойству для этого поля поддержки KabaDevices. Не уверен на 100%, является ли это причиной исключения, но, насколько я могу судить, все остальное должно работать нормально. Попробуй это:

public KabaDeviceListViewModel()
{

    var details = new ObservableCollection<KabaDeviceDetailViewModel>();

    KabaDevice kd1 = new KabaDevice("localhost A", "127.0.0.1", true);
    KabaDeviceDetailViewModel dvm = new KabaDeviceDetailViewModel(kd1);
    details.Add(dvm);

    KabaDevice kd2 = new KabaDevice("localhost B", "127.0.0.1", true);
    KabaDeviceDetailViewModel dvm2 = new KabaDeviceDetailViewModel(kd2);
    details.Add(dvm2);

    this.KabaDevices = details;
}
person Marc    schedule 02.10.2013
comment
как вы намекнули, это не причина ошибки. Параметр this.KabaDevices = _details; в коде @ user2135342 неэффективен, поскольку if (value! = _details) никогда не будет истинным. Я подозреваю, что настоящая ошибка в коде, который мы не видим. Однако ваше предложение по изменению кода актуально! - person Peter Holmes; 02.10.2013
comment
Привет, Марк, спасибо за быстрый ответ. Я уже пробовал это, и, к сожалению, это не решает проблему. Добавление моделей просмотра в конструктор работает нормально ... но почему-то несовместимо с использованием ItemsSource? В любом случае спасибо еще раз! - person user2135342; 02.10.2013
comment
Привет всем, действительно, что-то не так за кулисами (за пределами кода, показанного выше). Я не могу точно вспомнить, что я изменил, но я учел ваши замечания там, где это было необходимо. В этом смысле я считаю ваш ответ полезным. большое спасибо! С наилучшими пожеланиями. - person user2135342; 02.10.2013