Мой друг помог мне с примером.
Следующий ансвар:
Ваш DataContext в XAML неверен.Ваше представление должно связываться с вашей ViewModel, а не с вашей моделью.
Если вы запускаете MVVM, то неправильно использовать события нажатия кнопки в вашем коде Views.Это должно быть сделано в ViewModel.
Кроме того, ваш CSV-синтаксический анализатор неверен для реализации.Он сломается, как только поле содержит точку с запятой, новые строки или если в качестве разделителя полей используется точка с запятой, а не точка с запятой.
Подробнее о т. Д. Спецификация RFC для файлов CSV ЗДЕСЬ илииспользуйте библиотеку, которая может правильно анализировать файлы.ех. ExcelDataReader И, если вы хотите, чтобы это было в вашей DataTable; ExcelDataReader.DataSet
Ниже приведен пример функционального и правильного связывания.
MainWindow.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
XAML
<Window.DataContext>
<local:DataGridViewModel/>
</Window.DataContext>
<Grid>
<DataGrid Margin="0,0,0,35" ItemsSource="{Binding DatatableMerger}"/>
<Button Content="Add rows" Margin="0,0,10,10" Command="{Binding AddRowsButtonClickCommand}" Height="20" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75"/>
</Grid>
DataGridModel.cs
public class DataGridModel
{
public DataTable DatatableMerger { get; set; }
}
DataGridViewModel.cs
public class DataGridViewModel : INotifyPropertyChanged
{
private readonly DataGridModel _dataGridModel = new DataGridModel();
public DataTable DatatableMerger => _dataGridModel.DatatableMerger;
public ICommand AddRowsButtonClickCommand => new DelegateCommand(o => ReturnDataTableForGridView());
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
public void ReturnDataTableForGridView()
{
var dt = new DataTable();
dt.Columns.Add("Foo");
dt.Columns.Add("Bar");
dt.Columns.Add("Baz");
for (var i = 0; i < 5; i++)
dt.Rows.Add($"Value {i}", i, DateTime.Now.AddSeconds(i));
_dataGridModel.DatatableMerger = dt;
OnPropertyChanged(nameof(DatatableMerger));
}
}
Делегатские команды
public class DelegateCommand : ICommand
{
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;
public event EventHandler CanExecuteChanged;
public DelegateCommand(Action<object> execute) : this(execute, null) { }
public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
if (_canExecute is null)
return true;
return _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
public void RaiseCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
}
И для функции слияния.Вызовите функцию с YourMainTableName = Mergetables (Table1, table2);
public DataTable MergeTables(DataTable Table1, DataTable Table2)
{
DataTable Mergetable = new DataTable();
foreach (DataColumn d in Table1.Columns)
{
Mergetable.Columns.Add(d.ColumnName);
}
foreach (DataColumn d in Table2.Columns)
{
Mergetable.Columns.Add(d.ColumnName);
}
int Table1Cols = Table1.Columns.Count;
int Table1Rows = Table1.Rows.Count;
int Table2Cols = Table2.Columns.Count;
int Table2Rows = Table2.Rows.Count;
DataRow row2;
bool end = false;
int RowCount = 0;
while (!end)
{
end = true;
if (RowCount < Table1Rows || RowCount < Table2Rows)
{
end = false;
row2 = Mergetable.NewRow();
if (RowCount < Table1Rows)
{
for (int col = 0; col < Table1Cols; col++)
{
row2[col] = Table1.Rows[RowCount][col];
}
}
if (RowCount < Table2Rows)
{
for (int col = 0; col < Table2Cols; col++)
{
row2[col + Table1Cols] = Table2.Rows[RowCount][col];
}
}
Mergetable.Rows.Add(row2);
}
RowCount++;
}
return Mergetable;
}