【问题标题】:EditItem is not allowed for this view此视图不允许使用 EditItem
【发布时间】:2013-11-30 16:11:59
【问题描述】:

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

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

【问题讨论】:

  • 你不应该以这种方式使用 ObservableCollection,你需要有一个 ObservableCollection 不是每个项目都是一个 ObservableCollection 它自己。
  • @eranotzap 我该怎么做? (您能举一个班级的例子以及如何添加一个示例项目吗?)
  • 您是否尝试附加一个BeginningEdithandler 并设置e.Cancel = true ?这对我来说很好。请注意,这个答案不是我自己的,它来自@ouflak -> stackoverflow.com/questions/3002063/…
  • @DenizZoeteman Exmplae : ObservableCollection 你的意思是说除了它自己的字段之外的每个示例都是其他示例的集合吗?

标签: c# wpf wpfdatagrid observablecollection


【解决方案1】:

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 ).
   }

【讨论】:

  • 如何访问 MainWindow CS 中的示例?当我尝试示例时,我得到一个错误。
  • 示例 = 新的 ObservableCollection();
  • @DenizZoeteman 示例是 MainWindow.cs 中的一个属性,我将编辑答案并更详细地解释。
  • 有了你的编辑答案,不幸的是我仍然遇到同样的错误。
  • 您是否更改了 Example 类,使其不是 ObservaleCollection ? 1)发布您当前的示例课程
猜你喜欢
  • 2011-03-01
  • 2012-01-30
  • 2013-10-20
  • 2017-04-26
  • 2011-10-20
  • 2013-09-05
  • 1970-01-01
  • 2018-03-25
相关资源
最近更新 更多