单击时,WPF DataGrid会发出ArgumentOutOfRangeException

时间:2015-03-19 21:43:33

标签: c# wpf xaml mvvm datagrid

我是WPF和MVVM的新手,也是一般的新手,所以提前感谢您的耐心等待。

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

问题是,当您单击DataGrid中的任何内容时,程序会立即崩溃并出现ArgumentOutOfRange异常 - ("给定的DisplayIndex超出范围.DisplayIndex必须大于或等于0且小于列.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 个答案:

答案 0 :(得分:1)

问题确实是因为我没有产生任何传统的&#34;列。这显然是一个已知的错误,在此处记录:Microsoft Bug Report

作为一种解决方法,我只是在DataGrid中定义了一个不可见的列,它现在看起来行为正常:

<DataGrid.Columns>
     <DataGridTemplateColumn Visibility="Hidden" />
</DataGrid.Columns>