Dnguy025
Dnguy025

Reputation: 91

C# datagrid is not updating itemsource when get added

when typing in the textbox and click "Add Employee", i want it to update and display to the datagrid, i've implemented INotifyPropertyChanged and RelayCommand. what am i missing that's not populating the data. thanks in advance here is my model

public class EmployeeModel
{
    public string Name { get; set; }
    public int Pedicure { get; set; }
    public int Tip { get; set; }
    public int Total { get; set; }
}

this is my ViewModel

    List<EmployeeModel> employeeModel = new List<EmployeeModel>() { };

    private ICommand _addEmployeeCommand;

    public ICommand AddEmployeeCommand
    {
        get
        {
            return _addEmployeeCommand ?? (_addEmployeeCommand = new RelayCommand(x => { AddNewEmployee(); }));
        }
    }

    public List<EmployeeModel> Employee
    {
        get { return employeeModel; }
        set
        {
            if(value != employeeModel)
            {
                employeeModel = value;
                OnPropertyChanged("Employee");
            }
        }
    }

    private string employeeName;
    public string EmployeeName
    {
        get { return employeeName; }
        set
        {
            if (value != employeeName)
            {
                employeeName = value;
                OnPropertyChanged("EmployeeName");
            }
        }
    }

    public void AddNewEmployee()
    {
        Employee.Add(new EmployeeModel { Name = EmployeeName });
    }

here is my View

        <TabItem Header="Employee">
            <StackPanel Orientation="Vertical">
                <DataGrid ItemsSource="{Binding Employee}">
                </DataGrid>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Name: "/>
                    <TextBox Text="{Binding EmployeeName}"
                 Width="40"
                 Height="15"
                 VerticalAlignment="Top"/>
                    <Button Content="Add"
            Command="{Binding AddEmployeeCommand}"
                Height="20"
                VerticalAlignment="Top"/>
                </StackPanel>
            </StackPanel>

Upvotes: 2

Views: 581

Answers (1)

Bizhan
Bizhan

Reputation: 17085

(I pluralized the name Employee to Employees in this answer for future readers)

The problem is with the Source of the DataGrid

Bear in mind that OnPropertyChanged("Employees") only notifies about the changes made to the Employees and is not responsible for any changes made within Employees.

To be clear, it only works when you do employeeModels = new List<EmployeeModel>() And won't be called when Employees.Add(employee)

Hopefully WPF has its own ObservableCollection type that will take care of that:

    private ObservableCollection<Employee> _employees = new ObservableCollection<Employee>;
    public ObservableCollection<Employee> Employees { get { return _employees; } }

Upvotes: 2

Related Questions