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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2015, 00:54   #1
Notan1310
Форумчанин
 
Регистрация: 01.01.2012
Сообщений: 118
По умолчанию MVVM EF обновление БД в реальном времени

Доброго времени суток. Возможно ли отображение всех изменений в БД в реальном времени? Например добавил я через другую программу строку в БД и она тут же в моем приложений отобразится. Сейчас изменения отображаются только после перезагрузки программы. Мне кажется еще можно повторно загружать данные, но чего то я не могу понять как.

Код:
       public MainViewModel(IDataService dataService)
        {
            _dataService = dataService;
            _dataService.GetData(
                (posts, error) =>
                {
                    if (error != null)
                    {
                        // Report error here
                        return;
                    }
                    //PostList = new ObservableCollection<PostViewModel>(posts.Select(b => new PostViewModel(b)));
                    PostList = new ObservableCollection<IPost>(posts.Select(b => new Post(b.Id, b.Title, b.Href, b.ForumName, b.IdTable)));
 
 
                });      
        }
Код:
    public class DataService : IDataService
    {
        public void GetData(Action<List<Post>, Exception> callback)
        {
            List<Post> posts = new List<Post>();
 
            using (var db = new newPostsEntity())
            {
                var post = db.newPostForum;
                foreach (var itemPost in post)
                {
                    if (itemPost.visibility != "false")
                    {
                        string id = itemPost.id.ToString();
                        string title = itemPost.Title;
                        string href = itemPost.Href;
                        string forumName = itemPost.Forum;
                        posts.Add(new Post(Guid.NewGuid(), title, href, forumName, id));
                    }
                    else
                    {
                        continue;
                    }
                }
            } 
            callback(posts, null);          
        }
    }
Notan1310 вне форума Ответить с цитированием
Старый 10.10.2015, 12:35   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну так для получения новых данных можно просто вызвать GetData снова (или если не выкидывать DbContext сразу, то у него есть методы типа Refresh/Reload).

Вопрос только в том когда это делать. Вроде в БД нет никакого стандартного механизма для таких оповещений.
Можно например сделать какую-нибудь таблицу (с одной записью) с полем типа Timestamp (или просто инкрементирующееся число) и при добавлении новых данных обновлять это значение, ну а эта программа периодически проверяет его.

А в чем смысл копировать данные из itemPost в Post? И зачем генерировать какой-то Guid если уже есть id?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 10.10.2015, 15:31   #3
Notan1310
Форумчанин
 
Регистрация: 01.01.2012
Сообщений: 118
По умолчанию

Alex11223 ,благодарю.
Оформил следующим образом, postList успешно обновляется, но в ListView не происходит изменений.
Код:
        private void Execute()
        {
            
            // Запускаем новый поток
            Task.Factory.StartNew(() =>
            {
                for (int i = 1; i <= 1000; i++)
                {
                    int i1 = i;
                    // Усыпляем ненадолго поток
                    Thread.Sleep(1000);
                    _dataService.GetData(
                        (posts, error) =>
                        {
                        if (error != null)
                        {
                        // Report error here
                            return;
                        }
                       PostList = new ObservableCollection<IPost>(posts.Select(b => new Post(b.Id, b.Title, b.Href, b.ForumName, b.IdTable)));
                       
                });
                
                }
            });
        }

XAML код элемента
Код:

<GridViewColumn Header="Title" Width="650">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Path=Title, Mode=TwoWay}" TextDecorations="Underline" Foreground="Blue" Cursor="Hand" >                                                                                                        
                                </TextBlock>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
Notan1310 вне форума Ответить с цитированием
Старый 10.10.2015, 15:54   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А PostList как объявлен? Надо с INotifyPropertyChanged, чтоб листбокс узнал об изменении.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 10.10.2015 в 15:58.
Alex11223 вне форума Ответить с цитированием
Старый 10.10.2015, 16:06   #5
Notan1310
Форумчанин
 
Регистрация: 01.01.2012
Сообщений: 118
По умолчанию

Код:
public ObservableCollection<IPost> PostList { get; set; }
Но если я подставляю INotifyPropertyChanged то куча ошибок вываливается.
Notan1310 вне форума Ответить с цитированием
Старый 10.10.2015, 16:11   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну дык надо не подставлять, а реализовать его в классе и вызывать в сеттере (передавая имя свойства или с помощью CallerMemberName с C# 5).
https://www.google.com/search?q=INot...rtyChanged+wpf

У вас MVVMLight вроде? Оно там уже реализовано в его базовой ViewModel или ObservableObject, надо только RaisePropertyChanged вызывать.
Это ж показано во всех туториалах, и даже есть сниппеты типа mvvminpc для генерации свойства (если поставить через их инсталятор, а не просто библиотеку подключить в проект)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 10.10.2015 в 16:19.
Alex11223 вне форума Ответить с цитированием
Старый 10.10.2015, 16:20   #7
Notan1310
Форумчанин
 
Регистрация: 01.01.2012
Сообщений: 118
По умолчанию

Ясно. Спасибо!
Notan1310 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет набранных символов в реальном времени. Zerdone Microsoft Office Word 1 04.10.2013 01:11
График повышения температуры в реальном времени utro35 Общие вопросы Delphi 9 24.02.2012 13:19
сложение ячеек в реальном времени Nenado БД в Delphi 4 03.02.2012 10:16
Обработка в реальном времени aferistz PHP 3 25.10.2011 18:03