Abhishek
Abhishek

Reputation: 2945

DataGrid not updating with ObservableCollection

I have implemented a DataGrid as follows:

<DataGrid Name="grdSignals" Grid.Column="1" ItemsSource="{Binding}"  AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Signal Name" Binding="{Binding SignalName}"/>
        <DataGridTextColumn Header="Value" Binding="{Binding SignalValue}" />
    </DataGrid.Columns>
</DataGrid>

The following is the Class where I implemented the properties used in an ObservableCollection:

namespace Test
{
    public partial class MyMain : UserControl
    {        
        public ObservableCollection<Signals> ocSignalNames;
        Signals time, mode;

        public MyMain()
        {
            InitializeComponent();    
            ocSignalNames = new ObservableCollection<Signals>();            
            time = new Signals() { SignalName = "Time", SignalValue = "" };
            mode = new Signals() { SignalName = "Mode", SignalValue = "" };
            ocSignalNames.Add(time);
            ocSignalNames.Add(mode);
            grdSignals.DataContext = ocSignalNames;
        }
    }

    public class Signals : INotifyPropertyChanged
    {
        string _signalName, _signalValue;
        public string SignalName
        {
            get
            {
                return _signalName;
            }
            set
            {
                _signalName = value;
            }
        }

        public string SignalValue
        {
            get
            {
                return _signalValue;
            }
            set
            {
                _signalValue = value;
                OnPropertyChanged(SignalValue);
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

After debugging it, I found that the ocSignalNames is getting updated when its items change. But the changes are not getting reflected in the DataGrid. I am updating the Items in a thread like this:

time.SignalValue = iTest1.ToString();
mode.SignalValue = iTest2.ToString();

What am I missing out?

Upvotes: 0

Views: 1207

Answers (2)

Dhaval Patel
Dhaval Patel

Reputation: 7591

you have to use below mentioned code.

 string _signalName, _signalValue;
    public string SignalName
    {
        get
        {
            return _signalName;
        }
        set
        {
            _signalName = value;
            OnPropertyChanged("SignalName");
        }
    }

    public string SignalValue
    {
        get
        {
            return _signalValue;
        }
        set
        {
            _signalValue = value;
            OnPropertyChanged(SignalValue);
        }
    }

your XAML look like

 <DataGrid Name="grdSignals" Grid.Column="1" ItemsSource="{Binding}"  AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Signal Name" Binding="{Binding SignalName, Mode=TwoWay}"/>
            <DataGridTextColumn Header="Value" Binding="{Binding SignalValue, Mode=TwoWay}" />
        </DataGrid.Columns>
    </DataGrid>

O/P

enter image description here

Upvotes: 0

user128300
user128300

Reputation:

You are missing the correct NotifyChanged handlers:

    public string SignalName
    {
        get
        {
            return _signalName;
        }
        set
        {
            _signalName = value;
            OnPropertyChanged("SignalName"); //Added
        }
    }

    public string SignalValue
    {
        get
        {
            return _signalValue;
        }
        set
        {
            _signalValue = value;
            OnPropertyChanged("SignalValue"); //NOTE: quotation marks added
        }
    }

Upvotes: 1

Related Questions