WPF使用现有ItemsSource将对象添加到ListBox

时间:2014-12-07 22:47:04

标签: c# wpf xaml listbox

嘿,我有一个列表框,我将ItemsSource设置为来自我的数据库的ObservableCollection对象,我需要在此列表的末尾添加一个对象。但是我一直收到无效的操作异常。不知怎的,我的列表框正在使用中(在我看来它是一个给定的,因为它显示并已经有内容。)这是我的列表框的代码:

<ListBox x:Name="CarList" SelectionChanged="ItemSelected" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Background="{x:Null}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel FlowDirection="LeftToRight" ItemHeight="300" ItemWidth="300"/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>

        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Margin="10,10">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="35" />
                    </Grid.RowDefinitions>
                    <Image Grid.Row="0" Source="{Binding image_path}" VerticalAlignment="Stretch"/>
                    <Grid Grid.Row="1" Background="SteelBlue">
                        <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Margin="3" Text="{Binding model}"/>
                        <TextBlock HorizontalAlignment="Right" VerticalAlignment="Center" Margin="3" Text="{Binding price}"/>
                    </Grid>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
</ListBox>

我首先像这样设置ItemsSource:

CarList.ItemsSource = CarController.GetAllCars();

然后想要添加我的自定义对象:

ListBoxItem carAdd = new ListBoxItem();
carAdd.Content = new CarModel{ image_path = "/../Assets/add-512.png", id=-1};
CarList.Items.Add(carAdd);

但是最后一次操作失败并显示以下消息:

  

使用ItemsSource时,操作无效。访问和修改   而使用ItemsControl.ItemsSource的元素。

我已经找了一些其他的建议但是在他们的例子中都使用字符串和单个绑定,因此我无法弄清楚到底要做什么。如果有人得到建议,将非常感激。

- 感谢。

1 个答案:

答案 0 :(得分:5)

您需要将项目添加到项目来源,并且源应该是可观察的,以便ListBox考虑新项目:

var cars = new ObservableCollection<CarModel>(CarController.GetAllCars());
CarList.ItemsSource = cars;

...

var car = new CarModel{ image_path = "/../Assets/add-512.png", id=-1};
cars.Add(car);