Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2016, 17:23   #1
Ти6ка
Пользователь
 
Регистрация: 22.04.2015
Сообщений: 24
Сообщение WPF MVVM

Читаю данные из БД и вывожу их в ListView. После добавления новых данных хочу чтобы ListView обновлялся сразу, а не закрывать каждый раз приложения и открывать заново, чтобы увидеть новые данные.
Код:
public class ViewModel : ViewModelBase
    {
        public ObservableCollection<Worker> myCollection { get; set; }
        public ICommand ButtonInsert { get; set; }
        public ICommand ButtonDelete { get; set; }
        public ICommand ButtonFind { get; set; }
        public Worker worker = new Worker();
        public int n { get; set; }
        public string find { get; set; }
        public virtual int id
        {
            get
            {
                return worker.id;
            }
            set
            {
                worker.id = value;
                OnPropertyChanged("id");
            }
        }
        public virtual string name
        {
            get
            {
                return worker.name;
            }
            set
            {
                worker.name = value;
                OnPropertyChanged("name");
            }
        }
        public virtual int age
        {
            get
            {
                return worker.age;
            }
            set
            {
                worker.age = value;
                OnPropertyChanged("age");
            }
        }
        public virtual string speciality
        {
            get
            {
                return worker.speciality;
            }
            set
            {
                worker.speciality = value;
                OnPropertyChanged("speciality");
            }
        }
        public virtual int experience
        {
            get
            {
                return worker.experience;
            }
            set
            {
                worker.experience = value;
                OnPropertyChanged("experience");
            }
        }
        public virtual string salary
        {
            get
            {
                return worker.salary;
            }
            set
            {
                worker.salary = value;
                OnPropertyChanged("salary");
            }
        }

        public ViewModel() 
        {
            myCollection = new ObservableCollection<Worker>();
            UpdateCollection();
            ButtonInsert = new RelayCommand(arg => InsertMethod());
            ButtonDelete = new RelayCommand(arg => DeleteMethod());
            ButtonFind = new RelayCommand(arg => FindMethod());
        }

        public void UpdateCollection() 
        {
            myCollection.Clear();
            using (var session = NHibernateHelper.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var workers = session.QueryOver<Worker>().OrderBy(x => x.age).Asc.List();
                    foreach (var w in workers)
                    {
                        Worker work = new Worker();
                        work.id = w.id;
                        work.name = w.name;
                        work.age = w.age;
                        work.speciality = w.speciality;
                        work.experience = w.experience;
                        work.salary = w.salary;
                        myCollection.Add(work);
                    }
                    transaction.Commit();
                }
            }
        }

        public void InsertMethod()
        {
            using (var session = NHibernateHelper.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    Worker newWorker = new Worker(name = name, age = age, speciality = speciality, experience = experience, salary = salary);
                    session.Save(newWorker);
                    transaction.Commit();
                    MessageBox.Show("Дабавлено");
                }
            }
            UpdateCollection();
        }

        public void DeleteMethod()
        {
            using (var session = NHibernateHelper.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var work = session.Get<Worker>(n);
                    session.Delete(work);
                    transaction.Commit();
                    MessageBox.Show("Удалено");
                }
            }
            UpdateCollection();
        }

        public void FindMethod()
        {
            using (var session = NHibernateHelper.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var workers = session.QueryOver<Worker>().Where(x => x.name == find).List();
                    foreach(var work in workers)
                    {
                        Worker w = new Worker();
                        w.id = work.id;
                        w.name = work.name;
                        w.age = work.age;
                        w.speciality = work.speciality;
                        w.experience = work.experience;
                        w.salary = work.salary;
                    }
                    transaction.Commit();
                }
            }
        }
    }
Код:
public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
Ти6ка вне форума Ответить с цитированием
Старый 07.06.2016, 18:01   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А как к ListView прибиндено? По идее должно работать как-то так с ObservableCollection.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.06.2016, 18:14   #3
Ти6ка
Пользователь
 
Регистрация: 22.04.2015
Сообщений: 24
По умолчанию

Код:
ListView HorizontalAlignment="Left" Height="309" VerticalAlignment="Top" Width="408" ItemsSource="{Binding myCollection}" Margin="0,-9,0,0">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="ID" DisplayMemberBinding="{Binding id}"/>
                    <GridViewColumn Header="ФИО" DisplayMemberBinding="{Binding name}"/>
                    <GridViewColumn Header="Возраст" DisplayMemberBinding="{Binding age}"/>
                    <GridViewColumn Header="Специальность" DisplayMemberBinding="{Binding speciality}"/>
                    <GridViewColumn Header="Стаж" DisplayMemberBinding="{Binding experience}"/>
                    <GridViewColumn Header="Зарплата" DisplayMemberBinding="{Binding salary}"/>
                </GridView>
            </ListView.View>
        </ListView>
Код:
        <Button Content="Добавить" HorizontalAlignment="Left" Margin="544,149,0,0" VerticalAlignment="Top" Width="75" Command="{Binding ButtonInsert}"/>
        <Button Content="Удалить" HorizontalAlignment="Left" Margin="582,190,0,0" VerticalAlignment="Top" Width="75" Command="{Binding ButtonDelete}"/>

Последний раз редактировалось Ти6ка; 07.06.2016 в 18:16.
Ти6ка вне форума Ответить с цитированием
Старый 08.06.2016, 00:38   #4
Ти6ка
Пользователь
 
Регистрация: 22.04.2015
Сообщений: 24
По умолчанию

Помогите пожалуйста
Ти6ка вне форума Ответить с цитированием
Старый 08.06.2016, 09:50   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Может OnPropertyChanged и для коллекции надо?
По идее меняется только ее содержимое, а не сама ссылка, но в WPF вроде бы есть некоторые неочевидные особенности связанные с отсутствием INPC.

Проще все свойства VM сразу с INPC делать.
Если .NET4.5+, то можно упростить до
Код:
using System.Runtime.CompilerServices;

        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
и не передавать строку.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.06.2016, 16:28   #6
Ти6ка
Пользователь
 
Регистрация: 22.04.2015
Сообщений: 24
По умолчанию

Решил проблему. Дело в том что сама коллекция обновляется, а listview нет, поэтому его тоже нужно обновлять:
Код:
ICollectionView view = CollectionViewSource.GetDefaultView(myCollection);
            view.Refresh();
Ти6ка вне форума Ответить с цитированием
Старый 08.06.2016, 17:00   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Странно. Если вы не делали ничего с этим ViewSource (для фильтрации, сортировки), то должно и так работать.
Код:
using System;
using System.Collections.ObjectModel;
using System.Linq;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;

namespace MvvmLight12.ViewModel
{
    public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class MainViewModel : ViewModelBase
    {
        private readonly Random _rand = new Random();

        public MainViewModel()
        {
            Insert();
            Insert();
            Insert();
        }

        private ObservableCollection<Item> _items = new ObservableCollection<Item>();
        public ObservableCollection<Item> Items
        {
            get
            { return _items; }
            set
            {
                _items = value;
                //RaisePropertyChanged();
            }
        }

        private RelayCommand _insertCommand;
        public RelayCommand InsertCommand
        {
            get
            {
                return _insertCommand 
                       ?? (_insertCommand = new RelayCommand(Insert));
            }
        }

        private void Insert()
        {
            Items.Add(new Item
            {
                Id = _rand.Next(),
                Name = new string(Enumerable.Repeat(0, 8).Select(i => (char) _rand.Next(97, 123)).ToArray())
            });
        }
    }
}
Код:
<Window x:Class="MvvmLight12.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:ignore="http://www.galasoft.ch/ignore"
        mc:Ignorable="d ignore"
        Height="300"
        Width="300"
        DataContext="{StaticResource MainVm}">
    <Grid Margin="3">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        
        <ListView ItemsSource="{Binding Items}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}"/>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
            </GridView>
        </ListView.View>
        </ListView>

        <Button Grid.Row="1" Content="Добавить" HorizontalAlignment="Center" Padding="15,5" Margin="3" Command="{Binding InsertCommand}"/>
    </Grid>
</Window>
Код:
<Application x:Class="MvvmLight12.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="clr-namespace:MvvmLight12.ViewModel"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
			 xmlns:ignore="http://www.galasoft.ch/ignore"
             StartupUri="MainWindow.xaml"
             mc:Ignorable="d ignore">
    
    <Application.Resources>
        <vm:MainViewModel x:Key="MainVm" />
    </Application.Resources>
    
</Application>
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 08.06.2016 в 17:03.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WPF Mvvm Light работа с Таймерами - C# WPF Notan1310 WPF, UWP, WinRT, XAML 4 15.04.2016 05:07
WPF Mvvm CWD WPF, UWP, WinRT, XAML 0 22.07.2015 23:21
Вложенный биндинг MVVM WPF Egoist42 WPF, UWP, WinRT, XAML 0 29.08.2014 07:37
Комманды и ICommand в WPF MVVM andy301086 WPF, UWP, WinRT, XAML 0 09.07.2012 01:04
WPF LisBox Selectionchanged to MVVM Нике WPF, UWP, WinRT, XAML 0 10.04.2012 22:31