У меня есть 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 было необработанным)
Что я сделал не так?
Я предполагаю, что свойство доступа к объекту коллекции доступно только для чтения. См. Здесь информацию: 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
уведомляется.