powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Получения данных из DataGrid WPF MVVM
25 сообщений из 450, страница 5 из 18
Получения данных из DataGrid WPF MVVM
    #38461853
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУДрузья, ну так чё, какую педаль мне нужно вкорячить сюда, что бы изменилась только текущая запись? Вызов PropertyChangedEventArgs("Employees") перезапросит всю коллецию заново, что его зло и похабность...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public ICommand EmployeeSelectCommand
{
    get
    {
        return new RelayCommand((action) =>
        {
            if (PropertyChanged != null && action != null)
            {
                if (Service.OpenEmployeeDetailWindow(action as Employee))
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("Employees"));
                }
            }
        });
    }
}



Почему в WPF всё так через жопу? :)Так, отставить панику! Не понял, где тут ObservableCollection<Employee>? В ней и заменяй одну запись. Или я не понял структуры момента?
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461863
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КТак, отставить панику!
Ок

Алексей КНе понял, где тут ObservableCollection<Employee>? В ней и заменяй одну запись. Или я не понял структуры момента?
Оно мне никак не поможет, у меня же отвязанная сущность. Мы же раньше её отвязали через клонирование, чтобы оно после закрытия формы редактирования не обновлялось в гриде. Забыл?
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461874
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУВ конечном итоге приложение , которое будет хостится и рендериться ядром win8. В отвязке от SL и WPF. Промежуточный временный вариант пока - это SL аппликуха. Софтина для ритейла, обычное корпоративное расширение функионала, проинтегрированное с сапом, аксаптой, ms crm и прочими танцами с бубнами.Попутно вопрос, что мешает хранить ссылку на View в виде object , а приводить к конкретному типу внутри конкретного оконного сервиса?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class MyViewModel
{
    IWindowService WindowService = ...

    public object View { get; set; }

    void DoSomething()
    {
        // ....

        WindowService.CloseWindow(View);
    }
}
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461892
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПопутно вопрос, что мешает хранить ссылку на View в виде object , а приводить к конкретному типу внутри конкретного оконного сервиса?
Зачем эти костыли? Во-вторых, с этим проблем нет, давай не будет отвлекаться :)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461896
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КНе понял, где тут ObservableCollection<Employee>? В ней и заменяй одну запись. Или я не понял структуры момента?
Оно мне никак не поможет, у меня же отвязанная сущность. Мы же раньше её отвязали через клонирование, чтобы оно после закрытия формы редактирования не обновлялось в гриде. Забыл?А некуй было отвязывать.

Это всё должно производиться в одном классе, имеющем ссылку как на сам список, так и на редактируемую запись. А не инкапсулировать логику во ВьюМодель редактируемой записи, как ты сделал.

И вообще, некуй смешивать логику и данные, от этого одни проблемы.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461917
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КА некуй было отвязывать.
Сам же посоветовал :)

Алексей КЭто всё должно производиться в одном классе, имеющем ссылку как на сам список, так и на редактируемую запись. А не инкапсулировать логику во ВьюМодель редактируемой записи, как ты сделал.
Тема "окно как ссылка" вообще не относится к данной проблеме. Я его поднимаю в оконном сервисе, доступном во вью модели. Всё хорошо. Ты запутался :)

Алексей КИ вообще, некуй смешивать логику и данные, от этого одни проблемы.
Вот с этого момента поподробнее

P.S. Я дал исходники - напиши "правильно" и выложи )
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461919
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, смотри, моя реализация формы редактирования. Постю как есть:
Детям и беременным не открывать!
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
 
namespace SspMain
{
    public abstract class UiEditableCollection2<TListItem, TEditItem, TKey> : UiEditableCollectionBase<TListItem>
        where TListItem : class
        where TEditItem : class
    {
        #region SingleRowID Property
 
        public static readonly DependencyProperty SingleRowIDProperty =
            DependencyProperty.Register(
                "SingleRowID",
                typeof(object),
                typeof(UiEditableCollection2<TListItem, TEditItem, TKey>),
                new FrameworkPropertyMetadata((s, e) => ((UiEditableCollection2<TListItem, TEditItem, TKey>)s).SingleRowIDChanged(e))
            );
 
        public object SingleRowID
        {
            get { return (object)GetValue(SingleRowIDProperty); }
            set { SetValue(SingleRowIDProperty, value); }
        }
 
        void SingleRowIDChanged(DependencyPropertyChangedEventArgs e)
        {
            CommandManager.InvalidateRequerySuggested();
        }
 
        #endregion
 
        #region Add / Edit
 
        protected abstract FrameworkElement GetEditor();
 
        protected override void ActAddExecute()
        {
            GetNewEditItem()
                .LockUi()
                .ContinueWithSync(t =>
                {
                    var data = new EditorData<TEditItem> { Mode = UpdateAction.Insert, Data = t.Result };
                    var editor = GetEditor();
                    editor.DataContext = data;
                    ViewHelper.SetHeader(editor, "Новая запись");
                    WindowHelper.ShowAcceptDialog(editor, () => EditorAccepting(data));
                })
                .LogExceptions();
        }
 
        protected override bool ActAddCanExecute()
        {
            return base.ActAddCanExecute() && SingleRowID == null;
        }
 
        protected override void ActEditExecute()
        {
            GetEditItemByID(GetListItemID(Current))
                .LockUi()
                .ContinueWithSync(t =>
                {
                    var data = new EditorData<TEditItem> { Mode = UpdateAction.Update, Data = t.Result };
                    var editor = GetEditor();
                    editor.DataContext = data;
                    ViewHelper.SetHeader(editor, "Редактирование");
                    WindowHelper.ShowAcceptDialog(editor, () => EditorAccepting(data));
                })
                .LogExceptions();
        }
 
        protected virtual Task<bool> EditorAccepting(EditorData<TEditItem> data)
        {
            return SaveEditItem(data.Data, data.Mode)
                .ContinueWithSync(t => GetListItemByID(t.Result))
                .Unwrap()
                .ContinueWithSync(t =>
                {
                    AddOrReplace(t.Result, data.Mode);
                    OnDataChangeCompleted();
                    return true;
                });
        }
 
        #endregion
 
        #region Delete
 
        protected override void ActDeleteExecute()
        {
            if (CommonDialogs.AskForDeleteRow())
                DeleteByID(GetListItemID(Current))
                    .LockUi()
                    .ContinueWithSync(t =>
                    {
                        t.ThrowIfException();
                        RemoveCurrent();
                        OnDataChangeCompleted();
                    })
                    .LogExceptions();
        }
 
        #endregion
 
        #region RefreshCurrentItem
 
        #region ActRefreshCurrentItem
 
        public RelayCommand ActRefreshCurrentItem
        {
            get
            {
                if (_ActRefreshCurrentItem == null)
                    _ActRefreshCurrentItem = new RelayCommand(ActRefreshCurrentItemExecute, ActRefreshCurrentItemCanExecute);
                return _ActRefreshCurrentItem;
            }
        }
        RelayCommand _ActRefreshCurrentItem;
 
        void ActRefreshCurrentItemExecute()
        {
            RefreshCurrentItem()
                .LockUi()
                .LogExceptions();
        }
 
        bool ActRefreshCurrentItemCanExecute()
        {
            return HasItems;
        }
 
        #endregion
 
        public Task RefreshCurrentItem()
        {
            return GetListItemByID(GetListItemID(Current))
                .ContinueWithSync(t => ReplaceCurrent(t.Result));
        }
 
        #endregion
 
        #region Storage Actions
 
        protected abstract TKey GetListItemID(TListItem item);
        protected abstract Task<TEditItem> GetNewEditItem();
        protected abstract Task<TEditItem> GetEditItemByID(TKey id);
        protected abstract Task<TListItem> GetListItemByID(TKey id);
        protected abstract Task<TKey> SaveEditItem(TEditItem editItem, UpdateAction action);
        protected abstract Task DeleteByID(TKey id);
 
        #endregion
    }
}

...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461929
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУP.S. Я дал исходники - напиши "правильно" и выложи )Ща гляну.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461947
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУP.S. Я дал исходники - напиши "правильно" и выложи )Ща гляну.У меня VS2010, так что извиняй. :-)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461956
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУ, смотри, моя реализация формы редактирования
Какая-то жопа... Зачем так сложно и мутно?

И кстати, вспомнил, почему нужно дублировать поля во вьюмодели :)

Алексей КМСУ// Пачка дублирующего уныния, вместо пряморукого объекта Employee :(
public int EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }

Я бы не стал без необходимости дублировать поля модели во вьюмодели.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class Employee
{
    public int EmployeeId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

class EmployeeViewModel
{
    public Employee Model { get; set; }
}



Валидацию ты как собираешься делать? У меня вьюмодель реализует IDataErrorInfo, я пробегаю по свойствам и смотрю их изменения. По факту всё упирается в проверу:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class WindowService : IWindowService
{
    public Window ActiveWindow { get { return Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive); } }

    private bool Validate(DependencyObject instance)
    {
        return !Validation.GetHasError(instance) && LogicalTreeHelper.GetChildren(instance).OfType<DependencyObject>().All(child => Validate(child));
    }

    public bool IsValid { get { return Validate(ActiveWindow); } }
}



Вью модель:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public ICommand SaveCommand
{
    get
    {
        return new RelayCommand((action) =>
        {
            if (Service.IsValid)
            {
                var vm = action as EmployeeViewModel;
                Context.UpdateEmployee(vm.EmployeeId, vm.FirstName, vm.LastName);
                Service.CloseActiveWindow(true);
            }
        });
    }
}
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461960
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КУ меня VS2010, так что извиняй. :-)
Перекинуть ручками парочку файликов не судьба? Отмаз не принят, работай :)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461973
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КМСУ, смотри, моя реализация формы редактирования
Какая-то жопа... Зачем так сложно и мутно?Там в основном громозкие описания DependencyProperty + поддержка асинхронности. А там, там логики хрен да маленько.

МСУВалидацию ты как собираешься делать? У меня вьюмодель реализует IDataErrorInfo, я пробегаю по свойствам и смотрю их изменения. По факту всё упирается в проверу:У меня стойкое убеждение, что валидацию надо делать во View. Как раз для того, чтобы не дублировать свойства модели во вьюмодели.

В WPF DataBinding для этого есть все возможности. В SL вроде как оно тоже есть. А вот в WinRT этого не было, когда я на него в прошлый раз смотрел. Может что и поменялось. Ты если собрался под него писать - уточни этот вопрос.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461987
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КУ меня VS2010, так что извиняй. :-)
Перекинуть ручками парочку файликов не судьба? Отмаз не принят, работай :)Это чё?Error 1 The type or namespace name 'Caching' does not exist in the namespace 'System.Runtime' (are you missing an assembly reference?) c:\users\user\documents\visual studio 2010\Projects\WpfApplication3\WpfApplication3\Core\DataContext.cs 4 22 WpfApplication3У меня .Net4, оно там есть?

Логику управления списком после редактирования я бы разместил в EmployeesViewModel. Вероятно, SaveCommand надо туда перенести. Кароче, лень мне сейчас с нуля всё переписывать. :-)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38461988
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КТам в основном громозкие описания DependencyProperty + поддержка асинхронности. А там, там логики хрен да маленько.
Ну и на кой мне эти сопли с утечками памяти?

Алексей КУ меня стойкое убеждение, что валидацию надо делать во View. Как раз для того, чтобы не дублировать свойства модели во вьюмодели.
Так есть же IDataErrorInfo. Какое вью? )

Алексей КВ WPF DataBinding для этого есть все возможности. В SL вроде как оно тоже есть. А вот в WinRT этого не было, когда я на него в прошлый раз смотрел. Может что и поменялось. Ты если собрался под него писать - уточни этот вопрос.
Ок.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462004
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КУ меня .Net4, оно там есть?
Да, мемори кеш доступна с 4 фреймворка.
http://msdn.microsoft.com/ru-ru/library/system.runtime.caching.memorycache(v=vs.110).aspx

Алексей КЛогику управления списком после редактирования я бы разместил в EmployeesViewModel. Вероятно, SaveCommand надо туда перенести. Кароче, лень мне сейчас с нуля всё переписывать. :-)
Так и знал... :)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462018
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КТам в основном громозкие описания DependencyProperty + поддержка асинхронности. А там, там логики хрен да маленько.
Ну и на кой мне эти сопли с утечками памяти? Параноик.

Ты на логику смотри в ActAddExecute, ActEditExecute и EditorAccepting.

зы: Там к ActAddExecute и ActEditExecute привязаны RelayCommand в базовом классе.

МСУАлексей КУ меня стойкое убеждение, что валидацию надо делать во View. Как раз для того, чтобы не дублировать свойства модели во вьюмодели.
Так есть же IDataErrorInfo. Какое вью? )Говорю же, мне не нравится обёртывать model в лишний слой ради валидации. А дублировать свойства мне не нравится ещё больше. Но это кому как больше нравится. :-)

зы: Ты это, про асинхронности тоже не забывай. В SL и WinRT запросы к серверу только асинхронные.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462019
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ККароче, лень мне сейчас с нуля всё переписывать. :-)
Держи под десятую студию :)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462028
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей ККароче, лень мне сейчас с нуля всё переписывать. :-)
Держи под десятую студию :)Скачал.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462031
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КСкачал.
Там уже код с твоим ObservableCollection, но делу это не помогает. Задача - не рефрешить целый грид, а рефрешить только текущую запись. Как её решить, я хз...
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462059
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
public ICommand EmployeeSelectCommand
        {
            get
            {
                return new RelayCommand((action) =>
                {
                    if (PropertyChanged != null && action != null)
                    {
                        var employee = action as Employee;

                        // как-то клонирование надо замутить.
                        // XmlSerializer в помощь. :-)
                        var employee2 = Clone(employee);

                        if (Service.OpenEmployeeDetailWindow(employee2))
                        {
                            var i = Employees.IndexOf(employee);
                            Employees[i] = employee2;

                            // PropertyChanged(this, new PropertyChangedEventArgs("Employees"));
                        }
                    }
                });
            }
        }
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462067
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КТак?
Код: c#
1.
2.
3.
4.
5.
// как-то клонирование надо замутить.
// XmlSerializer в помощь. :-)
var employee2 = Clone(employee);

if (Service.OpenEmployeeDetailWindow(employee2))



Не понял, так в OpenEmployeeDetailWindow уже реализовано "клонирование". Двойное клонирование?
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462092
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КТак?
Код: c#
1.
2.
3.
4.
5.
// как-то клонирование надо замутить.
// XmlSerializer в помощь. :-)
var employee2 = Clone(employee);

if (Service.OpenEmployeeDetailWindow(employee2))



Не понял, так в OpenEmployeeDetailWindow уже реализовано "клонирование". Двойное клонирование?Ага, не увидел, тогда надо оттуда как-то вернуть "клона".
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462136
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно то, что в половину случаев проблемы возникают из-за отсутствия tracking object во VM. Тут надо свой велосипед сооружать. Мой в процессе..и тогда мы заживем.
ЗЫ кстати идею можно сп дить у EF DataContext.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462230
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netivanМой в процессе...А мой в планах, которые уже где-то около года откладываются.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38462274
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КАга, не увидел, тогда надо оттуда как-то вернуть "клона".
Так обращение к Employees перезапросит с БД новые экземпляры.
...
Рейтинг: 0 / 0
25 сообщений из 450, страница 5 из 18
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Получения данных из DataGrid WPF MVVM
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]