DataGrid добавить редактируемые строки WFP

1

У меня есть datagrid с 2 столбцами, без начальных данных, и мне нужно заставить пользователя иметь возможность добавлять столбцы по своему усмотрению.

Что я сделал, это добавить DataGrid, кнопку для добавления строки и класс, который представляет строку:

Xaml:

        <DataGrid AutoGenerateColumns="False" Height="51" HorizontalAlignment="Left" Margin="374,354,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="204" CanUserAddRows="True" AreRowDetailsFrozen="False" CanUserDeleteRows="True" ItemsSource="{Binding FilterBinding}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Key" IsReadOnly="False" Binding="{Binding Key}" ></DataGridTextColumn>
            <DataGridTextColumn Header="Value" IsReadOnly="False" Binding="{Binding Value}" ></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Add" Height="23" HorizontalAlignment="Left" Margin="503,330,0,0" Name="button5" VerticalAlignment="Top" Width="75" Click="button5_Click" />

MainWindow.xaml.cs:

private void button5_Click(object sender, RoutedEventArgs e)
    {
        var data = new FilterItem { key = "Key", value = "Value" };
        dataGrid1.Items.Add(data);
    }

FilterItem.cs:

public class FilterItem
{
    public string key { get; set; }
    public string value { get; set; }
}

Проблема в том, что добавляемые строки не редактируются, а двойной щелчок по ячейке вызывает исключение:

"EditItem" не разрешен для этого представления. (InvalidOperationException было необработанным)

Что я сделал не так?

Теги:
xaml
wpf
datagrid

1 ответ

0

Я предполагаю, что свойство доступа к объекту коллекции доступно только для чтения. См. Здесь информацию: MSDN: ItemsControl.Items.

Я бы создал магазин для предметов:

private ObservableCollection<FilterItem> _data = new ObservableCollection<FilterItem>();

public ObservableCollection<FilterItem> Data
{
  get { return _data; }
}

Теперь вы привязываете свой DataGrid к этому магазину, например:

<DataGrid ... ItemsSource="{Binding Data, ElementName=window}">

И, наконец, ваша кнопка:

_data.Add(new FilterItem());

С этим вы создаете хранилище в своем окне и привязываете DataGrid к этому магазину. Каждый раз, когда вы меняете коллекцию элементов, DataGrid показывает новые значения, и вы можете изменять элементы.

Я предлагаю реализовать INotifyPropertyChanged для вашего FilterItem. При этом каждый раз, когда вы меняете элемент, DataGrid уведомляется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню