WPF DataGridTextColumn прямое редактирование - PullRequest
0 голосов
/ 09 мая 2019

У меня очень простой DataGridTextColumn, который должен быть изменен при двойном щелчке. Вопрос в том, что следует добавить, чтобы избежать исключения System.InvalidOperationException: ''EditItem' is not allowed for this view.'

<DataGrid x:Name="DG" ItemsSource="{Binding}" GridLinesVisibility="None" Grid.Column="3" Grid.Row="2">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding VariantSet, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MinWidth="60" />
    </DataGrid.Columns>
</DataGrid>

простой класс:

Public Class CName
    Public Property Name As String = "not editable name"
End Class

при загрузке просто добавляется в сетку данных

Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    Me.DG.Items.Add(New CName)
End Sub

при объявлении через шаблон, как показано ниже, разницы нет, та же ошибка

        <DataGridTemplateColumn Header="Name" IsReadOnly="False">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
            <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Name}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellEditingTemplate>
        </DataGridTemplateColumn>

даже при добавлении Implements ComponentModel.INotifyPropertyChanged в CName без разницы

1 Ответ

1 голос
/ 09 мая 2019

Вы не показали нам достаточно, чтобы сказать, что вы делаете неправильно.

Вот рабочее окно с сеткой данных.

Код - c #, но вы можете запустить его через конвертер в vb, если вам особенно нужен vb. Я думаю, что для новичка плохая идея выбрать vb в наше время. Почти никто не публикует образцы с использованием vb.

В моем главном окне:

<Window.DataContext>
    <local:MainWindowViewModel/>
</Window.DataContext>
<Grid>
    <DataGrid AutoGenerateColumns="False"
              ItemsSource="{Binding People}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding FirstName}" Header="First Name"/>
            <DataGridTextColumn Binding="{Binding LastName}" Header="SurName"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Эта модель представления:

public class MainWindowViewModel : BaseViewModel
{
    private ObservableCollection<Person> people = new ObservableCollection<Person>();

    public ObservableCollection<Person> People
    {
        get { return people; }
        set { people = value; }
    }

    public MainWindowViewModel()
    {
        People.Add(new Person { FirstName = "Chesney", LastName = "Brown" });
        People.Add(new Person { FirstName = "Gary", LastName = "Windass" });
        People.Add(new Person { FirstName = "Liz", LastName = "McDonald" });
        People.Add(new Person { FirstName = "Carla", LastName = "Connor" });
    }
}

У человека просто есть эти два свойства: имя и фамилия:

public class Person : BaseViewModel
{
    private string firstName;

    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; RaisePropertyChanged(); }
    }
    private string lastName;

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; RaisePropertyChanged(); }
    }

Это наследуется от BaseViewmodel, который просто реализует inotifypropertychanged.

public  class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Здесь я редактирую строку

enter image description here

...