单击时 WPF DataGrid 给出 ArgumentOutOfRangeException
WPF DataGrid Gives ArgumentOutOfRangeException when clicked
我是 WPF 和 MVVM 的新手,总的来说是个新手,所以提前感谢您的耐心等待。
我在我的模型中使用自定义 class,我的视图模型中有一个该自定义对象的 ObservableCollection。在 class' 构造函数中,我在对象实例化时将其添加到集合中。在我看来,我正在使用绑定到集合的 DataGrid 来列出 class 的所有活动实例。我正在尝试实现从 DataGrid 到垃圾桶图标的拖放,这将允许用户处理不需要的 class.
实例
问题是,当您单击 DataGrid 中的任何内容时,程序会立即崩溃并出现 ArgumentOutOfRange 异常 - ("The given DisplayIndex is out of range. DisplayIndex must be greater than or equal to 0 and less than Columns.Count." "Actual value was 0")。 DisplayIndex 似乎与 DataGrid 列有关,所以这个异常可能是由于我没有显示传统意义上的任何列 - 在我的 DataGrid 中,AutoGenerateColumns 设置为 False,我正在显示我需要显示的所有内容使用行详细信息模板。 (这样做的原因是我显示 DataGrid 的区域很窄,所以我需要一个嵌套的、特定于项目的网格来正确表示项目。)DataGrid 显示并与集合同步很好,但显然有一些问题.我已经阅读了数十个关于 DataGrid 崩溃的链接,但没有发现任何涉及此异常的内容。
我想要的行为是在拖放时将 DataGrid 项表示的自定义对象传递给目标。我不在乎他们点击了哪个 "column" 或其他任何东西 - 我只需要一种方法将对象引用或 SelectedIndex(集合中的项目索引)传递给视图模型中的方法。
提前感谢您的帮助!有问题的代码 (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>
问题确实是因为我没有生成任何 "traditional" 列。这显然是一个已知错误,记录在此处:Microsoft Bug Report
作为解决方法,我刚刚在 DataGrid 中定义了一个不可见的列,现在它似乎可以正常运行:
<DataGrid.Columns>
<DataGridTemplateColumn Visibility="Hidden" />
</DataGrid.Columns>
我是 WPF 和 MVVM 的新手,总的来说是个新手,所以提前感谢您的耐心等待。
我在我的模型中使用自定义 class,我的视图模型中有一个该自定义对象的 ObservableCollection。在 class' 构造函数中,我在对象实例化时将其添加到集合中。在我看来,我正在使用绑定到集合的 DataGrid 来列出 class 的所有活动实例。我正在尝试实现从 DataGrid 到垃圾桶图标的拖放,这将允许用户处理不需要的 class.
实例问题是,当您单击 DataGrid 中的任何内容时,程序会立即崩溃并出现 ArgumentOutOfRange 异常 - ("The given DisplayIndex is out of range. DisplayIndex must be greater than or equal to 0 and less than Columns.Count." "Actual value was 0")。 DisplayIndex 似乎与 DataGrid 列有关,所以这个异常可能是由于我没有显示传统意义上的任何列 - 在我的 DataGrid 中,AutoGenerateColumns 设置为 False,我正在显示我需要显示的所有内容使用行详细信息模板。 (这样做的原因是我显示 DataGrid 的区域很窄,所以我需要一个嵌套的、特定于项目的网格来正确表示项目。)DataGrid 显示并与集合同步很好,但显然有一些问题.我已经阅读了数十个关于 DataGrid 崩溃的链接,但没有发现任何涉及此异常的内容。
我想要的行为是在拖放时将 DataGrid 项表示的自定义对象传递给目标。我不在乎他们点击了哪个 "column" 或其他任何东西 - 我只需要一种方法将对象引用或 SelectedIndex(集合中的项目索引)传递给视图模型中的方法。
提前感谢您的帮助!有问题的代码 (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>
问题确实是因为我没有生成任何 "traditional" 列。这显然是一个已知错误,记录在此处:Microsoft Bug Report
作为解决方法,我刚刚在 DataGrid 中定义了一个不可见的列,现在它似乎可以正常运行:
<DataGrid.Columns>
<DataGridTemplateColumn Visibility="Hidden" />
</DataGrid.Columns>