此视图不允许使用EditItem

时间:2013-11-17 14:49:49

标签: c# wpf wpfdatagrid observablecollection

我正在尝试以编程方式将项目添加到DataGrid并让用户编辑数据。但是,在尝试编辑数据时,我不断收到“此视图不允许EditItem”错误。我尝试创建类我正在添加一个ObservableCollection但它似乎没有改变错误。这些是我的代码的片段:

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添加项目:

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

示例类:

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;
    }
}

1 个答案:

答案 0 :(得分:3)

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 :(在您的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 ).
   }