Обновить (добавить или изменить) + удалить данные из сетки данных WPF MVVM - PullRequest
0 голосов
/ 15 апреля 2020

Я работаю над упражнением, чтобы улучшить свои навыки в DataGrid. Я (стараюсь) уважать шаблон MVVM.

У меня есть основа c DataGrid:

<DataGrid Grid.Row="1" Grid.Column="1" AutoGenerateColumns="False" AlternatingRowBackground="LightGray" CanUserAddRows="True" ItemsSource="{Binding DataGridSource, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedItem}">
        <DataGrid.Columns>
            <DataGridTextColumn Width="50" Header="Id" IsReadOnly="False" Binding="{Binding ID}" />
            <DataGridTextColumn Width="*" Header="Firstname" IsReadOnly="False" Binding="{Binding Firstname}" />
            <DataGridTextColumn Width="*" Header="Lastname" IsReadOnly="False" Binding="{Binding Lastname}" />
            <DataGridTextColumn Width="*" Header="Age" IsReadOnly="False" Binding="{Binding Age}" />
        </DataGrid.Columns>
    </DataGrid>

Более того, у меня есть следующая модель:

public class Person : ViewModelBase
{
    #region Variable
    private string _id;
    private string _lastname;
    private string _firstname;
    private string _age;
    #endregion Variable

    #region Constructor
    public Person()
    {

    }
    #endregion Constructor

    #region Properties
    public string ID 
    { 
        get
        {
            return _id;
        }
        set
        {
            _id = value;
            OnPropertyChanged("ID");
        }
    }

    public string Firstname
    {
        get
        {
            return _firstname;
        }
        set
        {
            _firstname = value;
            OnPropertyChanged("Firstname");
        }
    }

    public string Lastname
    {
        get
        {
            return _lastname;
        }
        set
        {
            _lastname = value;
            OnPropertyChanged("Lastname");
        }
    }

    public string Age
    {
        get
        {
            return _age;
        }
        set
        {
            _age = value;
            OnPropertyChanged("Age");
        }
    }
    #endregion Properties

    #region Public Method
    #endregion Public Method

    #region Private Method
    #endregion Private Method
}

Я хотел бы добавлять, изменять и удалять данные непосредственно из сетки данных. Чтобы успешно выполнить упражнение и поделиться этим сценарием (поскольку многие пытаются реализовать эти функции), я пишу класс ViewModel:

public class DataGridViewModel : ViewModelBase
    {
        #region Variable
        private Random rnd = new Random();
        #endregion Variable

        #region Constructor
        public DataGridViewModel()
        {
            DataGridSource = new ObservableCollection<object>();
            loadData();
            DataGridSource.CollectionChanged += _dataGridSource_CollectionChanged;
        }
        #endregion Constructor

        #region Properties
        private ObservableCollection<object> _dataGridSource = null;
        public ObservableCollection<object> DataGridSource
        {
            get 
            { 
                return _dataGridSource;
            }
            set 
            { 
                _dataGridSource = value;
            }
        }

        private Person _selectedItem;
        public Person SelectedItem
        {
            get
            {
                return _selectedItem;
            }
            set
            {
                _selectedItem = value;
                OnPropertyChanged("SelectedItem");
            }
        }
        #endregion Properties

        #region Public Method
        public void loadData()
        {
            for (int i = 1; i < 20; i++)
            {
                DataGridSource.Add(new Person()
                {
                    ID = i.ToString(),
                    Firstname = "Firstname " + i.ToString(),
                    Lastname = "Lastname " + i.ToString(),
                    Age = rnd.Next(20, 60).ToString(),
                });
            }
        }

        public void AddItems(Person itemsToAdd)
        {
            Console.WriteLine($"[Persons]\t" +
                $"ID :{itemsToAdd.ID}\t " +
                $"Firstname : {itemsToAdd.Firstname}\t " +
                $"Lastname : {itemsToAdd.Lastname}\t " +
                $"Age : {itemsToAdd.Age}\t " +
                $"> Added.");
        }

        public void ModifyItems(Person itemsToModify)
        {
            Console.WriteLine($"[Persons]\t" +
                $"ID :{itemsToModify.ID}\t " +
                $"Firstname : {itemsToModify.Firstname}\t " +
                $"Lastname : {itemsToModify.Lastname}\t " +
                $"Age : {itemsToModify.Age}\t " +
                $"> Modified.");
        }

        public void DeleteItems(Person itemsToDelete)
        {
            Console.WriteLine($"[Persons]\t" +
                $"ID :{itemsToDelete.ID}\t " +
                $"Firstname : {itemsToDelete.Firstname}\t " +
                $"Lastname : {itemsToDelete.Lastname}\t " +
                $"Age : {itemsToDelete.Age}\t " +
                $"> removed.");
        }
        #endregion Public Method

        #region Private Method
        private void _dataGridSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            //if (e.Action == NotifyCollectionChangedAction.Add)
            //{
            //    foreach (Person item in e.NewItems)
            //    {
            //        AddItems(item);
            //    }
            //}
            //if (e.Action == NotifyCollectionChangedAction.Replace)
            //{
            //    foreach (Person item in e.NewItems)
            //    {
            //        ModifyItems(item);
            //    }
            //}

            if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                foreach (Person item in e.OldItems)
                {
                    DeleteItems(item);
                }
            }
        }
        #endregion Private Method

Функция Delete работает хорошо. Но это единственный работающий.

Я следовал 11 старому учебнику по codeproject . Когда я реализую IEditableObject в моей модели и соответствующий ему интерфейс, я успешно изменяю данные, но не могу добавить новые.

Модель с IEditableObject:

public class Person : ViewModelBase, IEditableObject
{
    #region Variable
    private string _id;
    private string _lastname;
    private string _firstname;
    private string _age;
    private bool inTxn = false;
    #endregion Variable

    #region Constructor
    public Person()
    {

    }
    #endregion Constructor

    #region Properties
    public string ID
    {
        get
        {
            return _id;
        }
        set
        {
            _id = value;
            OnPropertyChanged("ID");
        }
    }

    public string Firstname
    {
        get
        {
            return _firstname;
        }
        set
        {
            _firstname = value;
            OnPropertyChanged("Firstname");
        }
    }

    public string Lastname
    {
        get
        {
            return _lastname;
        }
        set
        {
            _lastname = value;
            OnPropertyChanged("Lastname");
        }
    }

    public string Age
    {
        get
        {
            return _age;
        }
        set
        {
            _age = value;
            OnPropertyChanged("Age");
        }
    }
    #endregion Properties

    #region Public Method
    public void BeginEdit() { inTxn = true; }

    public void CancelEdit() { }

    public void EndEdit()
    {
        if (inTxn)
        {
            Console.WriteLine($"[Persons]\t" +
                $"ID :{this.ID}\t " +
                $"Firstname : {this.Firstname}\t " +
                $"Lastname : {this.Lastname}\t " +
                $"Age : {this.Age}\t " +
                $"> Modified.");
            inTxn = false;
        }
    }
    #endregion Public Method

    #region Private Method
    #endregion Private Method
}

Я бы предпочел использовать событие CollectionChanged в ObservableCollection для выполнения трех функций. Не могли бы вы помочь мне добиться успеха в этой части?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...