Инструментарий C # WPF: как сделать ячейку из сетки данных доступной для редактирования? - PullRequest
4 голосов
/ 05 августа 2009

Обратите внимание на код для этой маленькой программы WPF C #, созданной в 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("");
        }
    }
}

Эта программа просто показывает сетку данных инструментария WPF с 10 столбцами с заголовками и пустой строкой.

Существует проблема, которая возникает, когда определенная ячейка пустой строки выбирается и затем щелкается для редактирования: происходит сбой программы. В Visual Studio появляется окно с сообщением: «Нет исходного кода для текущего местоположения». Я хотел бы знать, как сделать ячейку из сетки данных доступной для редактирования?


Вот исключение и трассировка стека:

System.InvalidOperationException было необработанное сообщение = "EditItem" не разрешено для этого просмотра. "
Источник = "PresentationFramework"
Трассировки стека: в System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.EditItem (Object вещь) в Microsoft.Windows.Controls.DataGrid.EditRowItem (Object rowItem) в C: \ дд \ WPF_1 \ SRC \ МОФ \ SRC \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: линия 3396 в Microsoft.Windows.Controls.DataGrid.OnExecutedBeginEdit (ExecutedRoutedEventArgs д) в C: \ дд \ WPF_1 \ SRC \ МОФ \ SRC \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: линия 2208 в Microsoft.Windows.Controls.DataGrid.OnExecutedBeginEdit (Object отправитель, ExecutedRoutedEventArgs e) в C: \ дд \ WPF_1 \ SRC \ МОФ \ SRC \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: линия 2036 в System.Windows.Input.CommandBinding.OnExecuted (Object отправитель, ExecutedRoutedEventArgs e) в System.Windows.Input.CommandManager.ExecuteCommandBinding (Object отправитель, ExecutedRoutedEventArgs e, CommandBinding commandBinding) в System.Windows.Input.CommandManager.FindCommandBinding (CommandBindingCollection commandBindings, Отправитель объекта, RoutedEventArgs e, команда ICommand, Логическое выполнение) в System.Windows.Input.CommandManager.FindCommandBinding (Object отправитель, RoutedEventArgs e, ICommand команда, логическое выполнение) в System.Windows.Input.CommandManager.OnExecuted (Object отправитель, ExecutedRoutedEventArgs e) в System.Windows.UIElement.OnExecutedThunk (Object отправитель, ExecutedRoutedEventArgs e) в System.Windows.Input.ExecutedRoutedEventArgs.InvokeEventHandler (Delegate genericHandler, цель объекта) в System.Windows.RoutedEventArgs.InvokeHandler (Делегат обработчик, цель объекта) в System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object target, RoutedEventArgs RoutedEventArgs) в System.Windows.EventRoute.InvokeHandlersImpl (Object источник, RoutedEventArgs args, логическое значение ререйз) в System.Windows.UIElement.RaiseEventImpl (DependencyObject отправитель, RoutedEventArgs args) в System.Windows.UIElement.RaiseEvent (RoutedEventArgs args, булево доверенное) в System.Windows.Input.RoutedCommand.ExecuteImpl (Object параметр, цель IInputElement, Boolean userInitiated) в System.Windows.Input.RoutedCommand.Execute (Object параметр, цель IInputElement) в Microsoft.Windows.Controls.DataGrid.BeginEdit (RoutedEventArgs editEventArgs) в C: \ дд \ WPF_1 \ SRC \ МОФ \ SRC \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: линия 3059 в Microsoft.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDown (MouseButtonEventArgs д) в C: \ дд \ WPF_1 \ SRC \ МОФ \ SRC \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGridCell.cs: линия +748 в Microsoft.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDownThunk (Object отправитель, MouseButtonEventArgs e) в C: \ дд \ WPF_1 \ SRC \ МОФ \ SRC \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGridCell.cs: линия +726в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (Delegate genericHandler, объект genericTarget) в System.Windows.RoutedEventArgs.InvokeHandler (Делегат обработчик, цель объекта) в System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object target, RoutedEventArgs RoutedEventArgs) в System.Windows.EventRoute.InvokeHandlersImpl (Object источник, RoutedEventArgs args, логическое значение ререйз) в System.Windows.UIElement.ReRaiseEventAs (DependencyObject отправитель, RoutedEventArgs args, RoutedEvent newEvent) в System.Windows.UIElement.CrackMouseButtonEventAndReRaiseEvent (DependencyObject отправитель, MouseButtonEventArgs e) в System.Windows.UIElement.OnMouseDownThunk (Object отправитель, MouseButtonEventArgs e) в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (Delegate genericHandler, объект genericTarget) в System.Windows.RoutedEventArgs.InvokeHandler (Делегат обработчик, цель объекта) в System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object target, RoutedEventArgs RoutedEventArgs) в System.Windows.EventRoute.InvokeHandlersImpl (Object источник, RoutedEventArgs args, логическое значение ререйз) в System.Windows.UIElement.RaiseEventImpl (DependencyObject отправитель, RoutedEventArgs args) в System.Windows.UIElement.RaiseEvent (RoutedEventArgs args, булево доверенное) в System.Windows.Input.InputManager.ProcessStagingArea () в System.Windows.Input.InputManager.ProcessInput (InputEventArgs вход) в System.Windows.Input.InputProviderSite.ReportInput (InputReport inputReport) в System.Windows.Interop.HwndMouseInputProvider.ReportInput (IntPtr hwnd, режим InputMode, временная метка Int32, Действия RawMouseActions, Int32 x, Int32 y, Int32 wheel) в System.Windows.Interop.HwndMouseInputProvider.FilterMessage (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, логическое и обработанное) в System.Windows.Interop.HwndSource.InputFilterMessage (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, логическое и обработанное) на MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, логическое и обработанное) в MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object о) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (Делегат обратный вызов, объектные аргументы, логическое значение isSingleParameter) в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (Object источник, делегат обратного вызова, объект args, Boolean isSingleParameter, Делегат catchHandler) в System.Windows.Threading.Dispatcher.WrappedInvoke (Делегат обратный вызов, объектные аргументы, логическое значение isSingleParameter, Delegate catchHandler) в System.Windows.Threading.Dispatcher.InvokeImpl (DispatcherPriority приоритет, время ожидания, время делегата метод, объектные аргументы, логическое значение isSingleParameter) в System.Windows.Threading.Dispatcher.Invoke (DispatcherPriority приоритет, метод делегата, объект arg) в MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr LPARAM) в MS.Win32. UnsafeNativeMethods.DispatchMessage (MSG & сбщ) в System.Windows.Threading.Dispatcher.PushFrameImpl (DispatcherFrame Рамка) в System.Windows.Threading.Dispatcher.PushFrame (DispatcherFrame Рамка) в System.Windows.Threading.Dispatcher.Run () в System.Windows.Application.RunDispatcher (Object игнорировать) в System.Windows.Application.RunInternal (Window окно) в System.Windows.Application.Run (Window окно) в System.Windows.Application.Run () в WpfDatagridTest.App.Main () в C: \ Users \ Frank \ Documents \ Visual_Studio_2008 \ Projects \ WpfDatagridTest \ WpfDatagridTest \ OBJ \ Debug \ App.g.cs: линия 0 в System.AppDomain._nExecuteAssembly (Assembly сборка, строка [] args) в System.AppDomain.ExecuteAssembly (StringAssemblyFile, Доказательства AssemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.ThreadHelper.ThreadStart_Context (Object государство) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, ContextCallback обратный вызов, состояние объекта) в System.Threading.ThreadHelper.ThreadStart () InnerException:

1 Ответ

3 голосов
/ 05 августа 2009

Вы устанавливаете свой ItemsSource на Binding , но DataContext отсутствует, поэтому эта привязка бесполезна. Затем вы генерируете столбцы в коде и заполняете их временными данными. Из того, что я понимаю о DataGrid, редактирование поддерживается только при наличии данных, к которым привязана сетка. В противном случае, какие данные вы редактируете?

Кроме того, я считаю, что существует свойство IsReadOnly (см. Документацию DataGrid), для которого необходимо установить значение false (но я считаю, что по умолчанию оно равно false).

...