2016-12-23 3 views
1

У меня есть окно XAML, содержащее datagrid с 8 столбцами. Он считывает два плоских файла и заполняет datagrid значениями, которые содержатся в этих файлах. (Я не включил код для этого, так как это работает отлично и не имеет отношения к моему вопросу.) Я хочу, чтобы пользователь мог редактировать значения в столбцах «От» и «Кому», но не в любом из другие. Что происходит в данный момент, так это то, что когда пользователь нажимает на ячейку, вся строка подсвечивается (идет синим цветом), но нажатая ячейка также выделяется жирным шрифтом. Если пользователь затем нажимает на другую ячейку, ничего не происходит (кроме того, что выделены новые строки и ячейки). Если пользователь снова нажимает на выделенной ячейке или нажимает клавишу на клавиатуре, они получают следующее сообщение об ошибке:Как я могу позволить пользователю изменять значения в datagrid XAML?

Exception брошенную: «System.InvalidOperationException» в PresentationFramework.dll

Дополнительная информация: «EditItem» для этого представления не допускается.

Что я делаю неправильно?

Вот определение XAML:

<Window x:Class="CrewPlanEditor.Validate" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     Title="Check Duties" Height="571" Width="753" MinWidth="674" MinHeight="431" Background="#b3d9ff" Icon="CrewPLAN.ico"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="100"/> 
      <ColumnDefinition Width="100"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="50"/> 
      <RowDefinition Height="50"/> 
     </Grid.RowDefinitions> 
     <DataGrid x:Name="DgValidate" Grid.ColumnSpan="3" FontWeight="Normal" ItemsSource="{Binding}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Width="60" Header="Crew" Binding="{Binding DutyNo}" /> 
       <DataGridTextColumn Width="60" Header="Run" Binding="{Binding BusNo}" /> 
       <DataGridTextColumn Width="60" Header="From" Binding="{Binding From}" /> 
       <DataGridTextColumn Width="60" Header="To" Binding="{Binding To}" /> 
       <DataGridTextColumn Width="60" Header="Brk" Binding="{Binding Next}" /> 
       <DataGridTextColumn Width="60" Header="Type" Binding="{Binding DutyTypeName}" /> 
       <DataGridTextColumn Width="60" Header="Depot" Binding="{Binding Depot}" /> 
       <DataGridTextColumn Width="60" Header="Cost" Binding="{Binding Cost}" /> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

Вот C# позади него:

using System.Windows; 
using CrewPlanEditor.Contexts; 
using IO = System.IO; 

namespace CrewPlanEditor 
{ 
    /// <summary> 
    /// Interaction logic for Validate.xaml 
    /// </summary> 
    public partial class Validate 
    { 
     public Validate(string jobFolder) 
     { 
      var dutiesFile = IO.Path.Combine(jobFolder, "Data", "Duties.txt"); 
      var dutyTypesFile = IO.Path.Combine(jobFolder, "Data", "DutyTypes.txt"); 
      var duties = new DutiesFileReader().ReadFile(null, dutiesFile, dutyTypesFile).GridDutyData; 
      DataContext = duties; 
      InitializeComponent(); 
     } 
    } 
} 

ответ

1

Вы должны убедиться, что тип вашей коллекции "GridDutyData" поддерживает редактирование. Он должен реализовывать интерфейс IList. HashSet <T> нет, например, но список <T> и ObservableCollection do.

И если вы только хотите, чтобы пользователь, чтобы иметь возможность редактировать «С» и «В» столбцы можно установить IsReadOnly свойство других столбцов в True:

<DataGridTextColumn Width="60" Header="Crew" Binding="{Binding DutyNo}" IsReadOnly="True" /> /> 

Также убедитесь, что Свойства «От» и «К» имеют публичные сеттеры.

 Смежные вопросы

  • Нет связанных вопросов^_^