Search code examples
c#wpfdata-bindingdatagrid

How to update DataGrid


The DataContext of the app is bound to my MainViewModel. This ViewModel has a property services and some other properties. When I start a service I want to call OnPropertyChanged("Services") inside my StartService() and RefreshServices()but it is not updating.

My XAML/DataGrid:

        <DataGrid x:Name="dataGrid" Grid.Row="2" Grid.ColumnSpan="8"
                  ItemsSource="{Binding Services}"
                  AutoGenerateColumns="False"
                  IsReadOnly="True">

            <DataGrid.Columns>
                <DataGridTextColumn Header="Display Name"  Binding="{Binding DisplayName, Mode=OneWay}"/>
                <DataGridTextColumn Header="Status" Binding="{Binding Status, Mode=OneWay}" />
                <DataGridTextColumn Header="Machine Name" Binding="{Binding MachineName, Mode=OneWay }" />
                <DataGridTextColumn Header="Can Stop" Binding="{Binding CanStop, Mode=OneWay}" />
            </DataGrid.Columns>
        </DataGrid>

My ViewModel:

namespace ServiceStarterPRAT.ViewModels
{
    public class MainViewModel : ObservableObject
    {
        #region Services Properties
        private ObservableCollection<ServiceController> _services;
        private ObservableCollection<ServiceController> _selectedServices;

        public ObservableCollection<ServiceController> SelectedServices
        {
            get
            {
                return _selectedServices;
            }
            set
            {
                if (_selectedServices == null) return;
                _selectedServices = value;
                OnPropertyChanged("SelectedServices");
            }
        }
        public ObservableCollection<ServiceController> Services
        {
            get
            {
                _services.Clear();
                var curenntServices = Utils.UpdateServices(ComputerNames);
                foreach (var service in curenntServices)
                    if (service.MachineName == SelectedComputer)
                        if (Utils.CustomerNameOf(service) == SelectedCustomer)
                            _services.Add(service);
                return _services;
            }
            set
            {
                //if (_services == null) return;
                _services = value;
                OnPropertyChanged("Services");
                OnPropertyChanged("SelectedServices");
            }
        }

        #endregion

I think I haven't fully understood OnPropertyChanged(). I thought whenever I call something like OnPropertyChanged("Services")anything bound to the property Services will be notified and grab the updated data. However it is not.. what am I doing wrong. Which information do you need besides my XAML?


Solution

  • One thing you should change is this:

            set
            {
                if (_selectedServices == null) return;
                _selectedServices = value;
                OnPropertyChanged("SelectedServices");
            }
    

    _selectedServices is null initially and it will remain so. Setting it will always fail because it'll always just return.

    I suggest you always use curly braces as well for an if, by the way. Always put your statement on the next line.

      if (_selectedServices == null) 
         {
             // this is a terrible idea because it will always be true and your setter stops the property being set
              return;
         }