MoonKnight
MoonKnight

Reputation: 23831

DataGrid Updating for Added Rows but not for Added Columns

I have an MVVM app with a data bound DataGrid bound to Resources<ResourceViewModel>. I add an additonal resource/row to the resource data shown in the DataGrid via

private void OnResourceAddedToCollection(object sender, ResourceCollectionChangedEventArgs e)
{
    var viewModel = new ResourceViewModel(e.NewResource);
    Resources.Add(viewModel);
}

This works. However, I take exactly the same approach and attempt to add columns to the DataGrid via

private void OnResourceCultureCollectionChanged(object sender, 
    ResourceCulturesCollectionChangedEventArgs e)
{
    Resources.Clear();
    foreach (var rvm in e.NewResourceCollection.Select(r => new ResourceViewModel(r)).ToList())
        Resources.Add(rvm);
}

where the event arguments hold the updated underlying Resources. Now I have checked the data and it is right - the columns are being added, but the DataGrid is not showing the new columns. What am i doing wrong?

Upvotes: 2

Views: 92

Answers (1)

denis morozov
denis morozov

Reputation: 6316

When adding columns you need to repaint the datagrid, reset your DataGrid.ItemSource should do it.

VIEW:

public SomeView(IViewModel vm)
{
    ViewModel = vm;
    DataContext = ViewModel;

    InitializeComponent();

    ViewModel.PropertyChanged += (s, e) =>
    {
        switch (e.PropertyName)
        {
            case "IsResetingColumns":
                if (!ViewModel.IsResetingColumns)
                {
                    dataGrid.ItemsSource = null;
                    dataGrid.ItemsSource = ViewModel.Resources;
                }
                break;
            }
        };
    }

VIEWMODEL:

public class ViewModel : INotifyPropertyChanged
{
    private bool _isResetingColumns;

    public bool IsResetingColumns
    {
        get
        {
            return _isResetingColumns;
        }
        set
        {
            if (_isResetingColumns == value)
                return;
            _isResetingColumns = value;
            OnPropertyChanged("IsResetingColumns");
        }
    }

    private void OnResourceCultureCollectionChanged(object sender,
                                                    ResourceCulturesCollectionChangedEventArgs e)
    {
        //VIEWMODEL IS SETTING THIS TO TRUE BEFORE RESETTING `RESOURCES`
        IsResetingColumns = true;

        Resources.Clear();
        foreach (var rvm in e.NewResourceCollection.Select(r => new ResourceViewModel(r)).ToList())
            Resources.Add(rvm);

        //VIEW'S LISTENING TO THIS PROPERTY CHANGED (naming could be better, or an event ,but the gist is there)
        IsResetingColumns = false;
    }

Upvotes: 1

Related Questions