Stanley Mabunda Ответов: 1

Как удалить выбранный элемент из списка с помощью MVVM.


У меня есть приложение для телефонной книги, которое добавляет и сохраняет ввод пользователей в текстовый файл, я пытаюсь иметь функцию, которая позволяет пользователю выбирать сведения о пользователях из списка, а затем удалять их. Кроме того, когда вы нажимаете на пользователей, должен появиться экран с информацией о пользователях, который позволит вам редактировать и сохранять их снова в текстовый файл.
Я попробовал DeletedSelectedItemListBox, который я создал ниже,чтобы иметь возможность удалить выбранный элемент из моего списка.

Что я уже пробовал:

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using PhoneBook.View;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;

namespace PhoneBook.ViewModel
{
    class MainWindowViewModel : ViewModelBase
    {
        #region Constructor
        public MainWindowViewModel()
        {
            ReadTextFile();
        }

        #endregion
        #region Properties
        public const string MyListPropertyName = "ListBox";
        private List<string> _listBox = null;
        public List<string> ListBox
        {
            get
            {
                return _listBox = _listBox ?? new List<string>();
            }
            set
            {
                if (_listBox == value)
                {
                    return;
                }
                RaisePropertyChanged(MyListPropertyName);
                _listBox = value;
                RaisePropertyChanged(MyListPropertyName);
            }
          
          
        }
        private string _selectedItem = null;
        public string SelectedItem
        {
            get
            {
                return _selectedItem;
            }
            set
            {
                if (_selectedItem != null)
                {
                    return;
                }
                _selectedItem = value;
                RaisePropertyChanged();
            }
        }



        #endregion

        #region Method

        private void PopUpWindSelectedItem()
        {
           
        }

        private void DeleteSelectedItemListBox()
        {
            string FileName = (@"C: \Users\StanleyM\Desktop\PhoneBook\PhoneBook\bin\Debug\Personal.text");
            StreamReader streamReader = new StreamReader(FileName);
            string line = "";
            int Counter = -1;
            
            while ((line = streamReader.ReadLine()) != null)
            {
                foreach (var item in line)
                {
                    if (item.ToString() == SelectedItem.ToString())
                    {
                        Counter--;
                        ListBox.Remove(line);
                    }
                    
                }
               
            }

        }

        public void ReadTextFile()
        {
            string FileName = (@"C: \Users\StanleyM\Desktop\PhoneBook\PhoneBook\bin\Debug\Personal.text");
            DataTable dt = new DataTable("Client");
            StreamReader streamReader = new StreamReader(FileName);
            string line = "";
            int Counter = 0;
            while ((line = streamReader.ReadLine()) != null)
            {
                Counter++;
                ListBox.Add(item: line);
            }
        }

        private void PopUpWindow()
        {
            AddEditView PopUp = new AddEditView();
            PopUp.ShowDialog();

        }


        #endregion
        #region RelayCommand

        private RelayCommand _addCommand = null;
        public RelayCommand AddCommand
        {
            get
            {
                return _addCommand = _addCommand ?? new RelayCommand(() => PopUpWindow());
            }
        }

        private RelayCommand _deleteCommand = null;
        public RelayCommand DeleteCommand
        {
            get
            {
                return _deleteCommand = _deleteCommand ?? new RelayCommand(() => DeleteSelectedItemListBox());
            }
        }


        #endregion
    }
}

1 Ответов

Рейтинг:
6

Graeme_Grant

Во-первых, вам нужно использовать тип коллекции, который будет уведомлять пользовательский интерфейс о любых изменениях. Итак, это:

public const string MyListPropertyName = "ListBox";
private List<string> _listBox = null;
public List<string> ListBox
{
	get
	{
		return _listBox = _listBox ?? new List<string>();
	}
	set
	{
		if (_listBox == value)
		{
			return;
		}
		RaisePropertyChanged(MyListPropertyName);
		_listBox = value;
		RaisePropertyChanged(MyListPropertyName);
	}
}

можно изменить на это:
public ObservableCollection<string> ListBox { get; set; }
    = new ObservableCollection<string>();

Ваш XAML отсутствует, поэтому я не вижу, есть ли SelectedItem свойство привязано правильно.

Я также не могу проверить, если ваш DeleteCommand включен правильно. То RelayCommand поддерживает включение и выключение кнопки привязки. Так что вы могли бы подключить его как:
public RelayCommand DeleteCommand { get; private set; }

private void InitializeRelayCommands()
{
    DeleteCommand  = new RelayCommand
                    (() => DeleteSelectedItemListBox(),
                     () => isSelected);
}

private bool isSelected;

private string selectedItem;
public string SelectedItem
{
    get { return selectedItem; }
    set
    {
        Set(ref selectedItem, value); // ** see below
        isSelected = !string.IsNullOrEmpty(SelectedItem);
    }
}

** ViewModel должен наследовать Galasoft ViewModelBase.

Теперь, чтобы удалить элемент, вам нужно только добавить следующее, Где вы хотите удалить SelectedItem из коллекции:
if (!string.IsNullOrEmpty(SelectedItem))
{
    ListBox.Remove(SelectedItem);
    SelectedItem = string.Empty;
}

Наконец, чтобы избежать путаницы, не звоните в коллекцию ListBox но вместо этого что-то значимое вроде ContactNames и SelectedItem как SelectedContact Теперь ваш код самоописывается с помощью этих двух простых изменений:
ContactNames.Remove(SelectedContact);

Кроме того, вы используете неправильное пространство имен для RelayCommand.Менять:
using GalaSoft.MvvmLight.Command;

к:
using GalaSoft.MvvmLight.CommandWpf;

Так что ваш MainWindowViewModel теперь похоже:
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.CommandWpf;
using PhoneBook.View;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
 
namespace PhoneBook.ViewModel
{
    class MainWindowViewModel : ViewModelBase
    {
        #region Constructor
        
		public MainWindowViewModel()
        {
			InitializeRelayCommands();
            ReadTextFile();
        }
 
        #endregion
		
        #region Properties
        
        public ObservableCollection<string> ContactNames { get; set; }
            = new ObservableCollection<string>(); 

		private bool isSelected;
		 
		private string selectedContact;
		public string SelectedContact
		{
			get { return selectedContact; }
			set
			{
				Set(ref selectedContact, value);
				isSelected = !string.IsNullOrEmpty(selectedContact);
			}
		}
        #endregion
 
        #region Method
 
        private void PopUpWindSelectedContact()
        {
           
        }
 
        private void DeleteSelectedContactContactNames()
        {
            string FileName = (@"C: \Users\StanleyM\Desktop\PhoneBook\PhoneBook\bin\Debug\Personal.text");
            StreamReader streamReader = new StreamReader(FileName);
            string line = "";
            int Counter = -1;
            
            while ((line = streamReader.ReadLine()) != null)
            {
                foreach (var item in line)
                {
                    if (item == SelectedContact)
                    {
                        Counter--;
                        ContactNames.Remove(line);
                    }
                }
            }
        }
 
        public void ReadTextFile()
        {
            string FileName = (@"C: \Users\StanleyM\Desktop\PhoneBook\PhoneBook\bin\Debug\Personal.text");
            DataTable dt = new DataTable("Client");
            StreamReader streamReader = new StreamReader(FileName);
            string line = "";
            int Counter = 0;
            while ((line = streamReader.ReadLine()) != null)
            {
                Counter++;
                ContactNames.Add(item: line);
            }
        }
 
        private void PopUpWindow()
        {
            AddEditView PopUp = new AddEditView();
            PopUp.ShowDialog();
        }

        #endregion

        #region RelayCommand
 
        public RelayCommand AddCommand { get; private set; }
		public RelayCommand DeleteCommand { get; private set; }
		 
		private void InitializeRelayCommands()
		{
			AddCommand = new RelayCommand
			                (() => PopUpWindow());

			DeleteCommand  = new RelayCommand
							(() => DeleteSelectedContactContactNames(),
							 () => isSelected);
		}

        #endregion
    }
}