WPF数据网格在点击时出现ArgumentOutOfRangeException异常

3

我对WPF和MVVM都比较新,总的来说还是个新手,所以提前感谢您的耐心。

我在我的模型中使用了自定义类,并且在我的ViewModel中有一个该自定义对象的ObservableCollection。在类的构造函数中,当实例化时,我将对象添加到集合中。在我的视图中,我使用一个DataGrid来绑定到集合,以列出所有活动的类的实例。我试图实现从DataGrid拖放到垃圾桶图标的功能,允许用户处理不需要的类的实例。

问题在于,当您单击DataGrid中的任何内容时,程序会立即崩溃,并显示ArgumentOutOfRange异常 - (“给定的DisplayIndex超出范围。DisplayIndex必须大于或等于0且小于Columns.Count。”“实际值为0”)。DisplayIndex似乎与DataGrid列有关,因此这种异常可能是由于我没有以传统意义上的方式显示任何列而引起的-在我的DataGrid中,AutoGenerateColumns设置为False,我使用RowDetailsTemplate显示我需要显示的一切。(原因是我在显示DataGrid的区域很窄,所以我需要一个嵌套的、特定于项目的网格来适当地表示该项目。)DataGrid可以正常显示并与集合同步,但显然存在一些问题。我已经阅读了数十个有关DataGrid崩溃的链接,但没有找到涉及此异常的任何信息。

我的期望行为是将DataGrid项表示的自定义对象传递给目标,当我拖放它时。我不关心他们点击了哪个“列”或其他任何事情-我只需要一种方法来将对象引用或SelectedIndex(集合中的项目索引)传递给ViewModel中的一个方法。

提前感谢您的任何帮助!有问题的代码(XAML)似乎是:

<ScrollViewer DockPanel.Dock="Bottom" Margin="2" Width="180" ScrollViewer.VerticalScrollBarVisibility="Auto">
            <DataGrid ItemsSource="{Binding Path=myCollection, Mode=OneWay}" AutoGenerateColumns="False" RowDetailsVisibilityMode="Visible" HeadersVisibility="None">
                <DataGrid.RowDetailsTemplate>
                    <DataTemplate DataType="model:myClass">
                        <Border CornerRadius="10" Background="AliceBlue">
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="50" />
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition />
                                    <RowDefinition />
                                </Grid.RowDefinitions>
                                <TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding MyString1}" FontSize="21" VerticalAlignment="Bottom" />
                                <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding MyCustomProperty, Converter={StaticResource MyIValueConverter}}" VerticalAlignment="Bottom" />
                                <TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Text="{Binding MyString2}" TextWrapping="Wrap" />
                                <Image Source="/Resources/image1.png" Grid.Column="2" Grid.Row="0">
                                    <Image.DataContext>
                                        <Properties:Resources/>
                                    </Image.DataContext>
                                </Image>
                                <Image Source="/Resources/image2.png" Grid.Column="2" Grid.Row="1">
                                    <Image.DataContext>
                                        <Properties:Resources/>
                                    </Image.DataContext>
                                </Image>
                            </Grid>
                        </Border>
                    </DataTemplate>
                </DataGrid.RowDetailsTemplate>
            </DataGrid>
        </ScrollViewer>
1个回答

6
问题确实是因为我没有生成任何“传统”的列。这显然是一个已知的错误,在这里有记录:Microsoft Bug Report 作为解决方法,我只是在DataGrid中定义了一个不可见的列,现在它似乎表现正常:
<DataGrid.Columns>
     <DataGridTemplateColumn Visibility="Hidden" />
</DataGrid.Columns>

1
问题已解决。Bug报告的链接已经失效,但我正在使用.Net 4.6.1。 - dvdhns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接