Почему datagrid заполняется не всегда?
Вот уже пару дней пытаюсь привести программу в чистый MVVM. Весь код привел в порядок быстро, но вот заполнить DataGrid (wpf) получается как-то криво. Для начала код: Модель
public class MyModel : BindableBase
{
DataGrid dg = new DataGrid();
public DataTable DataTableView
{
get
{
return dt;
}
set
{
dt = value;
RaisePropertyChanged(nameof(DataTableView));
}
}
}
Модель представления
public class MyViewModel : BindableBase
{
MyModel myModel = new MyModel();
public MyViewModel()
{
myModel = App.myModel; \\ ссылка на модель, что б не юзать приставку App
myModel.PropertyChanged += (s, e) => { RaisePropertyChanged(e.PropertyName); };
}
}
public DataTable DT { get { return myModel.DataTableView; } set { myModel.DataTableView = value; RaisePropertyChanged(nameof(DT)); } }
В mainwindow
DataContext = App.myViewModel;
В XAML
<DataGrid x:Name="DataGrid_main" Margin="0,25,0,0" ItemsSource="{Binding DT, UpdateSourceTrigger=PropertyChanged}" AlternatingRowBackground="#FFE8E8E8" FontSize="14"/>
Так вот, таблица DataGrid не заполняется, хотя если дописать в свойстве в модели представления messagebox, то заполняется
public DataTable DT { get { MessageBox.Show(myModel.DataTableView.Rows.Count.ToString()); return myModel.DataTableView; } set { myModel.DataTableView = value; RaisePropertyChanged(nameof(DT)); } }
Я не понимаю, как это вообще влияет то... К слову в модели представления есть еще куча свойств и DelegateCommand (которые так же обращаются к myModel), все работают как положено
Ответы (2 шт):
Мне кажется если у вас после MessageBox это всё работает, то проблема не хватает задержки и поток не успевает прорисовать greed. Попробуйте расинхронизировать или синхронизировать потоки поставьте async await.
Проблема в не правильном присвоении данных из datatable.
Раньше: в Модели метод заполнял свойство DataTable, а свойство Модели Представления обращалась к свойству Модели,
Теперь: В Модели больше нет свойства DataTable, теперь Модель методом возвращает заполненную DataTable в Метод в Модели Представления, где оно присваивается свойству
public async void GetTableData()
{
DataTable dt_temp = new DataTable();
await Task.Run(() => dt_temp = myModel.GetTableData2()); // GetTableData2() - метод в модели, что возвращает заполненную DataTable
DT = dt_temp; // DT - свойство DataTable
}