【问题标题】:WPF: Data binding with ListView get error: "Items collection must be empty before using ItemsSource"WPF:与 ListView 的数据绑定获取错误:“使用 ItemsSource 之前项目集合必须为空”
【发布时间】:2012-05-31 14:22:33
【问题描述】:

我正在尝试将我的 ListView 数据绑定设置为 ObservableCollection。我添加了上下文菜单,并检查列表视图中每个项目的权限。所以我收到一个错误:“在使用 ItemsSource 之前,项目集合必须为空”。但是如果我删除 ListView 中的 ItemsSource,我就不能使用数据绑定。 你能帮助我吗?您可以在http://www.mediafire.com/?r21lm8ud9q92o5k下载示例

        <ListView ItemsSource="{Binding}"
        Height="259" HorizontalAlignment="Left" Margin="12,26,0,0" Name="listView1" VerticalAlignment="Top" Width="479">
        <ListView.Items>                
            <ListViewItem>                    
                <ListViewItem.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="Kiểm tra">
                            <MenuItem.Icon>
                                <Image Source="Images/CompareFiles.png" Style="{StaticResource ImageContextMenu}"/>
                            </MenuItem.Icon>
                        </MenuItem>

                        <MenuItem Header="Download" Visibility="{Binding Path=Name, Converter={StaticResource MenuContext}, ConverterParameter= {x:Static ObservableCollectionProblem:EnumUserAction.Download}}">
                            <MenuItem.Icon>
                                <Image Source="Images/SyncCurrentObject.png" Style="{StaticResource ImageContextMenu}"/>
                            </MenuItem.Icon>
                        </MenuItem>
                        <MenuItem Header="Upload" Visibility="{Binding Path=Actions, Converter={StaticResource MenuContext}, ConverterParameter = {x:Static ObservableCollectionProblem:EnumUserAction.Upload}}">
                            <MenuItem.Icon>
                                <Image Source="Images/upload.png" Style="{StaticResource ImageContextMenu}"/>
                            </MenuItem.Icon>
                        </MenuItem>
                    </ContextMenu>
                </ListViewItem.ContextMenu>
                <GridView>
                    <GridViewColumn Width="250" DisplayMemberBinding="{Binding Path=Name}" Header="Name"></GridViewColumn>
                    <GridViewColumn Width="250" DisplayMemberBinding="{Binding Path=Actions, Converter={StaticResource ActionToStringConverter}}" Header="Action"></GridViewColumn>
                </GridView>
            </ListViewItem>
        </ListView.Items>
        <ListView.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Kiểm tra">
                    <MenuItem.Icon>
                        <Image Source="Images/CompareFiles.png" Style="{StaticResource ImageContextMenu}"/>
                    </MenuItem.Icon>
                </MenuItem>

                <MenuItem Header="Download" Visibility="{Binding Path=Name, Converter={StaticResource MenuContext}, ConverterParameter= {x:Static ObservableCollectionProblem:EnumUserAction.Download}}">
                    <MenuItem.Icon>
                        <Image Source="Images/SyncCurrentObject.png" Style="{StaticResource ImageContextMenu}"/>
                    </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="Upload" Visibility="{Binding Path=Actions, Converter={StaticResource MenuContext}, ConverterParameter = {x:Static ObservableCollectionProblem:EnumUserAction.Upload}}">
                    <MenuItem.Icon>
                        <Image Source="Images/upload.png" Style="{StaticResource ImageContextMenu}"/>
                    </MenuItem.Icon>
                </MenuItem>                    
            </ContextMenu>
        </ListView.ContextMenu>
        <ListView.View>
            <GridView>                    
                <GridViewColumn Width="250" DisplayMemberBinding="{Binding Path=Name}" Header="Name"></GridViewColumn>
                <GridViewColumn Width="250" DisplayMemberBinding="{Binding Path=Actions, Converter={StaticResource ActionToStringConverter}}" Header="Action"></GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    ListView 中的项目只能有一次来源,在这种情况下,您似乎在 XAML 中明确设置了 ListView.Items 集合。这将导致您在尝试使用 ItemsSource 进行绑定时看到的错误。

    也许尝试从 XAML 中删除 ListView.Items 节点并仅使用 ItemsSource 绑定来填充列表。

    您似乎还想使用ListView.ItemTemplate 来设置您想要的项目格式并正确设置上下文菜单。

    【讨论】:

    • 你可以举例。我想设计两列,它看起来像 ListView,每个项目都有上下文菜单。
    • 我可以在GridViewColumn.CellTemplate中设置上下文菜单,但是如果我有很多列我觉得很愚蠢,我重复了很多次。
    • 我不想给你写,有很多使用ListView的数据模板的例子:msdn.microsoft.com/en-us/library/…wpftutorial.net/datatemplates.html
    • 是的,你也许可以使用 CellTemplate 来得到你想要的。
    【解决方案2】:

    我在 ItemContainerStyle 中添加上下文菜单及其成功

    <ListView Height="259" HorizontalAlignment="Left" Margin="12,26,0,0" Name="listView1" VerticalAlignment="Top" Width="479">                         
            <ListView.Resources>
                <ContextMenu x:Key="ItemContextMenu">                    
                    <MenuItem Header="Kiểm tra">
                        <MenuItem.Icon>
                            <Image Source="Images/CompareFiles.png" Style="{StaticResource ImageContextMenu}"/>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="Download" Visibility="{Binding Path=Actions, Converter={StaticResource MenuContext}, ConverterParameter= {x:Static ObservableCollectionProblem:EnumUserAction.Download}}">
                        <MenuItem.Icon>
                            <Image Source="Images/SyncCurrentObject.png" Style="{StaticResource ImageContextMenu}"/>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="Upload" Visibility="{Binding Path=Actions, Converter={StaticResource MenuContext}, ConverterParameter = {x:Static ObservableCollectionProblem:EnumUserAction.Upload}}">
                        <MenuItem.Icon>
                            <Image Source="Images/upload.png" Style="{StaticResource ImageContextMenu}"/>
                        </MenuItem.Icon>
                    </MenuItem>
                </ContextMenu>
            </ListView.Resources>
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="OnListViewItem_PreviewMouseLeftButtonDown" />
                    <Setter Property="ContextMenu" Value="{StaticResource ItemContextMenu}"/>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>                
                <GridView>                    
                    <GridViewColumn Width="250" DisplayMemberBinding="{Binding Path=Name}" Header="Name"></GridViewColumn>
                    <GridViewColumn Width="250" DisplayMemberBinding="{Binding Path=Actions, Converter={StaticResource ActionToStringConverter}}" Header="Action"></GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-04
      • 2013-08-08
      • 2012-08-02
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2012-07-24
      相关资源
      最近更新 更多