MVVM 在使用 ItemsSource 之前,项集合必须为空

今天在做ListBox和Combobox绑定的时候,都出现过“在使用 ItemsSource 之前,项集合必须为空”的错误。

Combobox比较简单,代码如下:

  <ComboBox x:Name="cbxPage" Width="30" Height="30" BorderBrush="{StaticResource CustomBorderColor}"
                          Style="{StaticResource CustomCombobox}" ItemsSource="{Binding PageList}" SelectedItem="{Binding CurrentPageIndex,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                          IsReadOnly="True"
                          >
                <i:EventTrigger EventName="SelectionChanged">
                    <i:InvokeCommandAction Command="{Binding CbxSelectedChangeCommand}" CommandParameter="{Binding SelectedItem,RelativeSource={RelativeSource AncestorType={x:Type ComboBox}}}"/>
                </i:EventTrigger>
            </ComboBox>

编译没有问题,运行时报错:“在使用 ItemsSource 之前,项集合必须为空”,百思不得其解,最后挨个检查,竟然是因为使用Interaction绑定command事件的时候代码有误,修改成下面的就可以了:

  <i:Interaction.Triggers >
                    <i:EventTrigger EventName="SelectionChanged">
                        <i:InvokeCommandAction Command="{Binding CbxSelectedChangeCommand}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource AncestorType={x:Type ComboBox}}}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>

ListBox是想要横向展示图片并且自动换行,代码如下:

 <ListBox ItemsSource="{Binding PersonList}" SelectedItem="{Binding CurrentPerson,Mode=TwoWay,NotifyOnSourceUpdated=True}"  ItemContainerStyle="{StaticResource PersonListBoxStyle}">
                <ListBox.Template>
                    <ControlTemplate TargetType="{x:Type ListBox}">
                        <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
                            <WrapPanel Orientation="Horizontal" IsItemsHost="True" ScrollViewer.CanContentScroll="True"/>
                        </ScrollViewer>
                    </ControlTemplate>
                </ListBox.Template>
                <ListBox.Items>
                        <StackPanel Orientation="Vertical" >
                            <Image  Width="145" Height="145" Stretch="Fill" Source="{Binding Path=show_pic,Converter={StaticResource FacePictureConverter}}"></Image>
                            <Grid Width="145" Height="22">
                                <TextBlock Text="{Binding p_name}" FontSize="14" Foreground="{StaticResource RichImageTextForeground}" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
                            </Grid>
                        </StackPanel>
                </ListBox.Items>
            </ListBox>

编译没有问题,运行时出错,因为是绑定数据源,所以不存在绑定之前Itemsource.clear(),与数据源无关。

查了很多资料,其中有一篇:http://www.verydemo.com/demo_c441_i91243.html

看了一下,觉得可能与ListBox的Template有关,试着改了一下,将ListBox.Items中的内容放到DataTemplate 中,然后使用ItemTemplate,就可以了

更改后的代码如下:

 <ListBox ItemsSource="{Binding PersonList}" SelectedItem="{Binding CurrentPerson,Mode=TwoWay,NotifyOnSourceUpdated=True}"  ItemTemplate="{DynamicResource persontemplate}" ItemContainerStyle="{StaticResource PersonListBoxStyle}">
                <ListBox.Template>
                    <ControlTemplate TargetType="{x:Type ListBox}">
                        <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
                            <WrapPanel Orientation="Horizontal" IsItemsHost="True" ScrollViewer.CanContentScroll="True"/>
                        </ScrollViewer>
                    </ControlTemplate>
                </ListBox.Template>
                <ListBox.Resources>
                    <DataTemplate x:Key="persontemplate">
                        <StackPanel Orientation="Vertical" >
                            <Image  Width="145" Height="145" Stretch="Fill" Source="{Binding Path=show_pic,Converter={StaticResource FacePictureConverter}}"></Image>
                            <Grid Width="145" Height="22">
                                <TextBlock Text="{Binding p_name}" FontSize="14" Foreground="{StaticResource RichImageTextForeground}" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock>
                            </Grid>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.Resources>
            </ListBox>

所以,深入了解,才能更好地使用,继续学习。

时间: 2024-11-13 06:52:06

MVVM 在使用 ItemsSource 之前,项集合必须为空的相关文章

【WPF异常】在使用 ItemsSource 之前,项集合必须为空

1 <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="620" Height="269" AutoGenerateColumns="False" GridLinesVisibility="Non

WPF 在使用 ItemsSource 之前,项集合必须为空

原文:WPF 在使用 ItemsSource 之前,项集合必须为空 <DataGrid x:Name="datagrid" ItemsSource="{Binding ElementName=Mwindow, Path=Preson}" Margin="0,0,0,20"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Name}"

获取列表中某一个文件夹下的列表项集合(不包含子文件夹对象,也不包含子文件夹中的列表项)

RT,方法如下: 1 SPListItemCollection GetSubItemsWithoutFoldersInParrentFolder(SPFolder parrent) 2 { 3 SPList list = parrent.Item.ParentList; 4 SPQuery query = new SPQuery(); 5 query.Folder = parrent; 6 query.Query = "<Where><Eq><FieldRef Na

判断集合是否为空 、 工具类

/**     * 判断集合是否为空     *      * @param list     *            集合     */    public static boolean isEmpty(List list) {        if (list != null && list.size() > 0) {            return false;        } else {            return true;        }    }

java 对象、集合的非空判断

自我总结,有什么不到位的地方,请各位纠正补充,感激不尽! 目的:使程序更严谨 ***对象验证是否不为空:  if( null != obj ) ***List验证不为空:if( null != list && list.size() > 0 ) ***Map验证不为空:if( null != map && map.size() > 0 ) 好了,废话不多说,上代码 实体类Student(随便起一个) package com.core.test; public c

判断集合是否非空

/** * 判断集合是否非空 * @param collection * @return */ public static boolean isEmptyCollection(Collection<?> collection){ boolean flag = true; if(null != collection){ if(collection.size() > 0){ flag = false; } } return flag; } /** * 判断集合是否非空 * @return *

对集合进行判空的操作

if(null == list || list.size() ==0 ){ //为空的情况 }else{ //不为空的情况 } 如果想判断list是否为空,可以这么判断: 但是, list.isEmpty() 和  list.size()==0  有啥区别呢? 答案:没有区别 . isEmpty()判断有没有元素,而size()返回有几个元素, 如果判断一个集合有无元素 建议用isEmpty()方法.比较符合逻辑用法. list!=null  跟  ! list.isEmpty()有什么区别?

循环删除Dictionary集合中为空的Key,其他集合均可改造

/// <summary>/// 移除为空的Key/// </summary>/// <param name="dic"></param>/// <returns></returns>private static Dictionary<string, string> RemoveNullKey(Dictionary<string, string> dic){string keyNames =

重新绑定ItemsSource先设置ItemsSource = null;的原因

即报错信息为:在使用 ItemsSource 之前,项集合必须为空. 原因:Items和ItemSource,只能有一个生效,想用其中一个,另一个必须是空. 重新绑定ItemSource,虽然绑定的集合对象Clear了,但是items还没有清空:然后再次绑定就会有问题. 所以要么设置ItemSource =null :要么 Items.Clear();