Search code examples
c#wpfwpfdatagridobservablecollection

EditItem is not allowed for this view


I'm trying to add items programmaticly to a DataGrid and letting the user edit the data. However, I keep getting "EditItem is not allowed for this view" errors when trying to edit data. I tried making the class I'm adding an ObservableCollection but it doesn't seem to change the errors. These are snippets of my code:

XAML:

<DataGrid x:Name="DataGridExample" HorizontalAlignment="Left" Margin="35,40,0,0" VerticalAlignment="Top" Height="220" Width="525" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Path=Name}" ClipboardContentBinding="{x:Null}" Header="Filename"/>
                <DataGridTextColumn Binding="{Binding Path=Prefix}" ClipboardContentBinding="{x:Null}" Header="Prefix"/>
                <DataGridCheckBoxColumn Binding="{Binding Path=Sign}" ClipboardContentBinding="{x:Null}" Header="Sign"/>
                <DataGridCheckBoxColumn Binding="{Binding Path=Bin}" ClipboardContentBinding="{x:Null}" Header="Bin"/>
                <DataGridTextColumn Binding="{Binding Path=FolderPath}" ClipboardContentBinding="{x:Null}" Header="Folderpath"/>
            </DataGrid.Columns>
</DataGrid>

MainWindowClass adding the item:

Example newExample = new Example() { FolderPath = folderpath, Name = foldername, Prefix = foldername, Bin = false, Sign = false };
DataGridExample.Items.Add(newExample);

Example class:

public class Example : ObservableCollection<Example>
{
    public string FolderPath { get; set; }

    public string Name { get; set; }

    public string Prefix { get; set; }

    public bool Sign { get; set; }

    public bool Bin { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

Solution

  • xaml :

       <DataGrid ItemsSource="{Binding Examples}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Path=Name}" Header="Filename"/>
                <DataGridTextColumn Binding="{Binding Path=Prefix}" Header="Prefix"/>
                <DataGridCheckBoxColumn Binding="{Binding Path=Sign}" Header="Sign"/>
                <DataGridCheckBoxColumn Binding="{Binding Path=Bin}" Header="Bin"/>
                <DataGridTextColumn Binding="{Binding Path=FolderPath}" Header="Folderpath"/>
            </DataGrid.Columns>
       </DataGrid>
    

    CS: (In your MainWindow.cs)

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this; // By setting itself to be it's own DataContext 
         // i can easily  bind to properties in my code behind (There are other ways but this is the most               correct and easy one.)
        }
    
    
       private ObservableCollection<Example> _examples;
       public ObservableCollection<Example> Examples
       {
           get
           {
              if(_examples == null)
                   _examples = new ObservableCollection<Example>();
              return _examples; 
           } 
       }
    
       public void OnAddingItem()
       {
           Example newExample = new Example() { FolderPath = folderpath, Name = foldername, Prefix = foldername, Bin = false, Sign = false };
           Examples.Add(newExample); // Because Examples is an ObservableCollection it raises a    
        //CollectionChanged event when adding or removing items,
        // the ItemsControl (DataGrid) in your case corresponds to that event and creates a new container for the item ( i.e. new DataGridRow ).
       }