Pergunta

Tome nota do código para este pequeno programa WPF C # feitos com Microsoft Visual Studio 2008:

XAML

<Window x:Class="WpfDatagridTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfToolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <WpfToolkit:DataGrid 
        x:Name="DataGrid_" ItemsSource="{Binding}"
        SelectionMode="Extended"
        CanUserAddRows="False" CanUserDeleteRows="False"
        CanUserResizeRows="False" CanUserSortColumns="False"
        AutoGenerateColumns="False"
        RowHeaderWidth="17" RowHeight="25" />
    </Grid>
</Window>

cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Windows.Controls;

namespace WpfDatagridTest
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            const int MAX = 10;

            for(int i = 0; i < MAX; ++i)
                DataGrid_.Columns.Add(new DataGridTextColumn()
                {
                    Header = i
                });
            DataGrid_.Items.Add("");
        }
    }
}

Este programa mostra simplesmente um conjunto de ferramentas datagrid WPF com 10 colunas com cabeçalhos e uma linha vazia.

Não há problema que ocorre quando uma determinada célula da linha vazia é selecionada e, em seguida, clicou a ser editado: o programa trava. Uma caixa de mensagem aparece no Visual Studio dizendo o seguinte: "Não há código fonte disponível para o local atual." Eu gostaria de saber como posso fazer uma célula de um datagrid ser editável?


Aqui é a exceção e stacktrace:

System.InvalidOperationException foi unhandled Message = " 'EditItem' não é permitida para este ponto de vista. "
Fonte = "PresentationFramework"
StackTrace: em System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.EditItem (Object item) em Microsoft.Windows.Controls.DataGrid.EditRowItem (Object rowItem) em C: \ dd \ WPF_1 \ src \ WPF \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: linha 3396 em Microsoft.Windows.Controls.DataGrid.OnExecutedBeginEdit (ExecutedRoutedEventArgs e) No C: \ dd \ WPF_1 \ src \ WPF \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: linha 2208 em Microsoft.Windows.Controls.DataGrid.OnExecutedBeginEdit (Object remetente, ExecutedRoutedEventArgs e) em C: \ dd \ WPF_1 \ src \ WPF \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: linha 2036 em System.Windows.Input.CommandBinding.OnExecuted (Object remetente, ExecutedRoutedEventArgs e) em System.Windows.Input.CommandManager.ExecuteCommandBinding (Object remetente, ExecutedRoutedEventArgs e, CommandBinding CommandBinding) em System.Windows.Input.CommandManager.FindCommandBinding (CommandBindingCollection CommandBindings, Object sender, RoutedEventArgs e, comando ICommand, Booleano executar) em System.Windows.Input.CommandManager.FindCommandBinding (Object remetente, RoutedEventArgs e, ICommand comando, Boolean executar) em System.Windows.Input.CommandManager.OnExecuted (Object remetente, ExecutedRoutedEventArgs e) em System.Windows.UIElement.OnExecutedThunk (Object remetente, ExecutedRoutedEventArgs e) em System.Windows.Input.ExecutedRoutedEventArgs.InvokeEventHandler (delegado GenericHandler, objecto alvo) em System.Windows.RoutedEventArgs.InvokeHandler (delegado manipulador, objecto alvo) em System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object alvo, RoutedEventArgs RoutedEventArgs) em System.Windows.EventRoute.InvokeHandlersImpl (Object fonte, args RoutedEventArgs, boolean reraise) em System.Windows.UIElement.RaiseEventImpl (DependencyObject remetente, args RoutedEventArgs) em System.Windows.UIElement.RaiseEvent (RoutedEventArgs args, Boolean confiável) em System.Windows.Input.RoutedCommand.ExecuteImpl (Object parâmetro, alvo IInputElement, Boolean userInitiated) em System.Windows.Input.RoutedCommand.Execute (Object parâmetro, alvo IInputElement) em Microsoft.Windows.Controls.DataGrid.BeginEdit (RoutedEventArgs editingEventArgs) em C: \ dd \ WPF_1 \ src \ WPF \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: linha 3059 em Microsoft.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDown (MouseButtonEventArgs e) No C: \ dd \ WPF_1 \ src \ WPF \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGridCell.cs: linha 748 em Microsoft.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDownThunk (Object remetente, MouseButtonEventArgs e) em C: \ dd \ WPF_1 \ src \ WPF \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGridCell.cs: line 726 em System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (delegado GenericHandler, genericTarget Object) em System.Windows.RoutedEventArgs.InvokeHandler (delegado manipulador, objecto alvo) em System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object alvo, RoutedEventArgs RoutedEventArgs) em System.Windows.EventRoute.InvokeHandlersImpl (Object fonte, args RoutedEventArgs, boolean reraise) em System.Windows.UIElement.ReRaiseEventAs (DependencyObject remetente, args RoutedEventArgs, RoutedEvent NewEvent) em System.Windows.UIElement.CrackMouseButtonEventAndReRaiseEvent (DependencyObject remetente, MouseButtonEventArgs e) em System.Windows.UIElement.OnMouseDownThunk (Object remetente, MouseButtonEventArgs e) em System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (delegado GenericHandler, genericTarget Object) em System.Windows.RoutedEventArgs.InvokeHandler (delegado manipulador, objecto alvo) em System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object alvo, RoutedEventArgs RoutedEventArgs) em System.Windows.EventRoute.InvokeHandlersImpl (Object fonte, args RoutedEventArgs, boolean reraise) em System.Windows.UIElement.RaiseEventImpl (DependencyObject remetente, args RoutedEventArgs) em System.Windows.UIElement.RaiseEvent (RoutedEventArgs args, Boolean confiável) em System.Windows.Input.InputManager.ProcessStagingArea () em System.Windows.Input.InputManager.ProcessInput (InputEventArgs entrada) em System.Windows.Input.InputProviderSite.ReportInput (InputReport inputReport) em System.Windows.Interop.HwndMouseInputProvider.ReportInput (IntPtr hwnd, modo InputMode, Int32 timestamp, ações RawMouseActions, Int32 x, Int32 Y, roda Int32) em System.Windows.Interop.HwndMouseInputProvider.FilterMessage (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & tratado) em System.Windows.Interop.HwndSource.InputFilterMessage (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & tratado) em MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & tratado) em MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) em System.Windows.Threading.ExceptionWrapper.InternalRealCall (delegado callback, args Object, Boolean isSingleParameter) em System.Windows.Threading.ExceptionWrapper.TryCatchWhen (Object fonte, delegado de retorno de chamada, Object args, booleana isSingleParameter, Delegado catchHandler) em System.Windows.Threading.Dispatcher.WrappedInvoke (delegado callback, args Object, Boolean isSingleParameter, Delegado catchHandler) em System.Windows.Threading.Dispatcher.InvokeImpl (DispatcherPriority prioridade, TimeSpan tempo limite, Delegado método, args objecto, booleano isSingleParameter) em System.Windows.Threading.Dispatcher.Invoke (DispatcherPriority prioridade, método delegado, arg Object) em MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) em MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG & msg) em System.Windows.Threading.Dispatcher.PushFrameImpl (DispatcherFrame quadro, Armação) em System.Windows.Threading.Dispatcher.PushFrame (DispatcherFrame quadro, Armação) em System.Windows.Threading.Dispatcher.Run () em System.Windows.Application.RunDispatcher (Object ignorar) em System.Windows.Application.RunInternal (Janela janela) em System.Windows.Application.Run (Janela janela) em System.Windows.Application.Run () em WpfDatagridTest.App.Main () em C: \ Users \ Frank \ Documents \ Visual_Studio_2008 \ Projects \ WpfDatagridTest \ WpfDatagridTest \ obj \ Debug \ App.g.cs: linha 0 em System.AppDomain._nExecuteAssembly (Assembly montagem, String [] args) em System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args) em Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () em System.Threading.ThreadHelper.ThreadStart_Context (Object Estado) em System.Threading.ExecutionContext.Run (executionContext executionContext, ContextCallback de chamada de retorno, estado do objeto) em System.Threading.ThreadHelper.ThreadStart () InnerException:

Foi útil?

Solução

Você está definindo o seu ItemsSource a Ligação , mas não há DataContext para que essa ligação é inútil. Então você está gerando as colunas no código-behind e enchê-los com dados temporários. Pelo que eu entendo sobre o DataGrid, edição é suportado apenas se houver dados que a grade está vinculado. Caso contrário, os dados que você está editando?

Além disso, eu acredito que há um IsReadOnly propriedade (verifique a documentação DataGrid), que precisa ser definido como falso (mas eu acho que é falso por padrão).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top