Работа с элементами ListView (MVVM)

302
23 ноября 2017, 00:54

Как реализовать удаление/изменение/добавление выделенных элементов ListView

class MainWindowModel : DependencyObject
{
    public MainWindowModel()
    {
        var studentList = Data.Students.GetStudents();
        Students = CollectionViewSource.GetDefaultView(studentList);
    }
    public ICollectionView Students
    {
        get { return (ICollectionView)GetValue(StudentsProperty); }
        set { SetValue(StudentsProperty, value); }
    }
    public static readonly DependencyProperty StudentsProperty =
        DependencyProperty.Register("Students", typeof(ICollectionView), typeof(MainWindowModel), new PropertyMetadata(null));
    private ICommand _clickCommand;
    private bool _canExecuteDelete = true;
    private bool _canExecuteChange = true;
    private bool _canExecuteAdd = true;
    public ICommand DeleteCommand
    {
        get
        {
            return _clickCommand ?? (_clickCommand = new CommandHandler(() => { DeleteAction(); }, _canExecuteDelete));
        }
    }
    public ICommand ChangeCommand
    {
        get
        {
            return _clickCommand ?? (_clickCommand = new CommandHandler(() => { ChangeAction(); }, _canExecuteChange));
        }
    }
    public ICommand AddCommand
    {
        get
        {
            return _clickCommand ?? (_clickCommand = new CommandHandler(() => { AddAction(); }, _canExecuteAdd));
        }
    }
    private void DeleteAction()
    {
        // If (ICollectionView Students.Count == 0)
        //{
        //   _canExecuteDelete = false;
        //   _canExecuteChange = false;
        //}
    }
    private void ChangeAction()
    {
    }
    private void AddAction()
    {
        _canExecuteDelete = true;
        _canExecuteChange = true;
    }
    public class CommandHandler : ICommand
    {
        private Action _action;
        private bool _canExecute;
        public CommandHandler(Action action, bool canExecute)
        {
            _action = action;
            _canExecute = canExecute;
        }
        public bool CanExecute(object parameter)
        {
            return _canExecute;
        }
        public event EventHandler CanExecuteChanged;
        public void Execute(object parameter)
        {
            _action();
        }
    }
}
public class Student
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string FullName { get { return FirstName + " " + Last; } }
    public string Last { get; set; }
    public int Age { get; set; }
    public bool Gender { get; set; }
}
public class StudentViewModel : INotifyPropertyChanged
{
    private Student student;
    public StudentViewModel(Student student)
    {
        this.student = student;
    }
    public string FirstName
    {
        get { return student.FirstName; }
        set
        {
            student.FirstName = value;
            OnPropertyChanged("FirstName");
        }
    }
    public string FullName
    {
        get { return student.FirstName + " " + student.Last; }
        set
        {
            student.FirstName = value.Split(' ')[0];
            student.Last = value.Split(' ')[1];
            OnPropertyChanged("FullName");
        }
    }
    public string Last
    {
        get { return student.Last; }
        set
        {
            student.Last = value;
            OnPropertyChanged("Last");
        }
    }
    public int Id
    {
        get { return student.Id; }
        set
        {
            student.Id = value;
            OnPropertyChanged("Id");
        }
    }
    public int Age
    {
        get { return student.Age; }
        set
        {
            student.Age = value;
            OnPropertyChanged("Age");
        }
    }
    public bool Gender
    {
        get { return student.Gender; }
        set
        {
            student.Gender = value;
            OnPropertyChanged("Gender");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string prop = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
    }
}
public class Students
    {
        [XmlElement("Student")]
        public List<Student> List { get; set; }
<Button Command="{Binding AddCommand}" CommandParameter="{Binding SelectedItems, ElementName=StudentListBox}" Content="Добавить" HorizontalAlignment="Left" Margin="10,0,0,10" Grid.Row="1" Width="75" Height="20" VerticalAlignment="Bottom"/>
        <Button Command="{Binding ChangeCommand}" CommandParameter="{Binding SelectedItems, ElementName=StudentListBox}" Content="Изменить" HorizontalAlignment="Left" Margin="90,0,0,10" Grid.Row="1" Width="75" Height="20" VerticalAlignment="Bottom"/>
        <Button Command="{Binding DeleteCommand}" CommandParameter="{Binding SelectedItems, ElementName=StudentListBox}" Content="Удалить" HorizontalAlignment="Left" Margin="170,0,0,10" Grid.Row="1" Width="75" Height="20" VerticalAlignment="Bottom"/>
    <ListView x:Name="StudentListBox" Margin="10" ItemsSource="{Binding Students}" SelectionMode="Multiple">
                 <ListView.View>
                    <GridView>
                        <GridViewColumn DisplayMemberBinding="{Binding Id}" Header="ID" />
                        <GridViewColumn DisplayMemberBinding="{Binding FullName}" Header="Фамилия Имя" />
                        <GridViewColumn DisplayMemberBinding="{Binding Age, ValidatesOnExceptions=True, StringFormat={}{0} лет}"  Header="Возраст" />
                        <GridViewColumn DisplayMemberBinding="{Binding Gender, ValidatesOnExceptions=True, Converter={StaticResource GenderConverter}}" Header="Пол" />
                    </GridView>
                </ListView.View>
            </ListView>
READ ALSO
C# работа с бд в онлайн и оффлайн режиме

C# работа с бд в онлайн и оффлайн режиме

Есть бд на MySQL которая располагается на хостингеНужно реализовать возможность работать с базой локально когда отсудствует подключение к интернету

197
Группировка в LINQ, Подсчет суммы

Группировка в LINQ, Подсчет суммы

Привет коллегиЕсть данные по заказам, кто делает и сколько дней, вытянул основные поля это имя сотрудника и кол-во дней на выполнение заказа:

302
Запись во внутреннее хранилище Android Xamarin

Запись во внутреннее хранилище Android Xamarin

Пишу пробное приложение, простой рекордер стрима со штатной камеры и запись вmp4

297
Выбор элемента DataGridView

Выбор элемента DataGridView

Выбирается третий элемент в dataGridVie2, хотя нажимаю на любойКак сделать чтобы в dataGridView2

206