2015-03-19 3 views
1

Я довольно новичок в WPF и MVVM и новичок в целом, поэтому заблаговременно за ваше терпение.WPF DataGrid дает ArgumentOutOfRangeException при нажатии

Я использую пользовательский класс в своей модели, и у меня есть ObservableCollection этого пользовательского объекта в моей модели viewmodel. В конструкторе класса я добавляю объект в коллекцию при его создании. На мой взгляд, я использую DataGrid, привязанный к коллекции, чтобы перечислять все активные экземпляры класса. Я пытаюсь реализовать drag-and-drop из 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

вопрос действительно был, потому что я не генерируя никаких «традиционных» столбцов. Это, очевидно, известная ошибка, описываемая здесь: Microsoft Bug Report

В качестве обходного пути, я определил невидимый столбец внутри DataGrid и, кажется, ведут себя должным образом в настоящее время:

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