Я создал небольшое примерное приложение, чтобы показать вам, как вы можете добавлять элементы в свою DataGrid.
Ваша DataGrid должна быть привязана к ObservableCollection<T>
, где T - это тип вашего DataClass.Определение вашего DataGrid
тогда выглядит примерно так:
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Items}" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Host" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock VerticalAlignment="Center" Margin="4,2" Text="{Binding Host, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Login" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock VerticalAlignment="Center" Margin="4,2" Text="{Binding Login, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Password" Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock VerticalAlignment="Center" Margin="4,2" Text="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Тогда у вас есть Button
для добавления новых строк в ItemsSource DataGrid.Button
может выглядеть следующим образом:
<Button Grid.Row="1" Content="Add item" Command="{Binding AddItemCommand}"/>
В вашем коде c # AddItemCommand, к которому привязана команда вашей кнопки, выглядит следующим образом:
private ICommand addItemCommand;
public ICommand AddItemCommand
{
get { return addItemCommand ?? (addItemCommand = new RelayCommand(AddItem)); }
}
private void AddItem(object obj)
{
Items.Add(new MyItem());
}
И ObservableCollection<T>
где DataGrid
имеет вид:
private ObservableCollection<MyItem> items;
public ObservableCollection<MyItem> Items
{
get { return items ?? (items = new ObservableCollection<MyItem>()); }
}
Так что теперь, когда вы нажимаете кнопку, будет выполняться команда AddItemCommand, и это добавляет новый Item в ItemsSource DataGrid.
RelayCommand является реализацией ICommand
-интерфейса.Так что вам не нужно использовать click-события.Таким образом, вы можете отсоединить ваши XAML-определения (View) от вашей C # -Logic (ViewModel).Это один из важных шагов для работы с MVVM-шаблоном.
public class RelayCommand : ICommand
{
private readonly Action<object> execute;
private readonly Predicate<object> canExecute;
public RelayCommand(Action<object> execute, Predicate<object> canExecute = null)
{
if(execute == null)
throw new ArgumentException(nameof(execute));
this.execute = execute;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return canExecute == null || canExecute(parameter);
}
public void Execute(object parameter)
{
execute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}
Если вы новичок в WPF, вам следует взглянуть на MVVM-шаблон.Это действительно полезно