New to MVVM and struggling to figure out where I went wrong when attempting to bind a dynamically generated DataTable with a DataGrid. I've found some solutions and attempted to make adjustments to my implementation based on previous responses:
XAML:
<DataGrid x:Name="Grid" Margin="5,0,0,0" ItemsSource="{Binding dataTable, Mode=TwoWay}" AutoGenerateColumns="False" VerticalAlignment="Center">
<DataGrid.Columns>
<DataGridTextColumn Header="Header1" Binding="{Binding Column1Name}"/>
<DataGridTextColumn Header="Header2" Binding="{Binding Column2Name}"/>
</DataGrid.Columns>
<DataGrid.DataContext>
<ViewModels:Presenter/>
</DataGrid.DataContext>
XAML CS:
DataTable dataTable = new DataTable();
Grid.DataContext = dataTable.DefaultView;
//I don't believe I should be using System.Data in View?
ViewModel
.Presenter:
public class Presenter : ObservableObject {
private DataTable _dataTable;
public DataTable dataTable
{
get { return _dataTable; }
set
{
_dataTable = value;
RaisePropertyChangedEvent("Grid");
}
}
private void ParseData()
{
if (string.IsNullOrWhiteSpace(ID)) return;
dataTable = DataParser.ParseURL(ID);
}
}
.ObservableObject
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChangedEvent(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
I know the data from the model is returning correctly, and when I'm in debugger the RaisePropertyChangedEvent is firing, but the view is not being updated.
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));instead of creating a variable and checking fornull:)