powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Получения данных из DataGrid WPF MVVM
25 сообщений из 450, страница 1 из 18
Получения данных из DataGrid WPF MVVM
    #38327456
Alex_studenticu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день господа форумчане.
Возник вопрос, как при использовании паттерна MVVM в WPF при выделении строки в DataGrid получить её содержимое?
вот код:
1. ViewModel
получаем заполненный DataSet
Код C#

Код: 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.
//в конструкторе
SongTable = _songDs.Tables["****"];
 
// свойство 
private DataTable _songTable;
        public DataTable SongTable
        {
            get { return _songTable; }
            set
            {
                if (_songTable == value) return;
                _songTable = value;
                OnPropertyChanged(SongTable.ToString());
            }
        }
 
  private List<Song> _selectSong;
        public List<Song> SelectSong {
            get { return _selectSong; }
            set
        {
            if (_selectSong == value) return;
            _selectSong = value;
            OnPropertyChanged("SelectSong");
        } }
 


2.Model
Код XML

Код: xml
1.
2.
3.
4.
<DataGrid AutoGenerateColumns="True"  Height="67" HorizontalAlignment="Left" Margin="12,12,0,0"
                  Name="dataGrid1" VerticalAlignment="Top" Width="479" ItemsSource="{Binding SongTable, Mode=TwoWay}"
                 SelectedItem="{Binding SelectSong,Mode=TwoWay}"/>
 


Насколько я понимаю, при выделении строки в DataGrid должно сработать SelectedItem и данные передадутся в SelectSong, но этого не происходит
Подскажите пожалуйста!
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38327546
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SelectedItem - объект, а не список. public List<Song> Song SelectSong
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38327567
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaSelectedItem - объект, а не список. public List<Song> Song DataRowView SelectSongПоправил
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38328436
Alex_studenticu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
к сожалению проблема не в том Song or List<Son>, там вообще просто с DataGrid при выделении строки совсем другой тип возвращается:(
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38329026
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_studenticu,

Недавно что-то похожее делал.
Сажаешь обработчик события в датагрид (можешь расширить текущий датагрид либо добавить бихейвер) по клику мышкой на датагриде. Далее через InputHitTest ищешь парент с нужным тебе типом - в твоем случае DataGridRow.
Ну и в принципе все.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38329296
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_studenticu,

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

Как принято красиво при нажатии кнопка “Отмена” (ESC или крестик) вернуть обратно первоначальное значение выделенной строки грида?

Я конечно могу подтасовать новый экземпляр и намапить его свойства из предыдущего, тогда у меня будут разные объекты. Но как-то это жестоко…

...
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<Window x:Class="WpfApplication.EmployeeDetailWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="EmployeeDetailWindow" Height="249" Width="338" WindowStartupLocation="CenterOwner" ResizeMode="NoResize">
    <Grid>
        <TextBox Text="{Binding Path=Employee.LastName}" HorizontalAlignment="Left" Height="23" 
Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="300"/>
        <TextBox Text="{Binding Employee.FirstName}" HorizontalAlignment="Left" Height="23" Margin="10,38,0,0" TextWrapping="Wrap"
VerticalAlignment="Top" Width="300"/>
        <Button Command="{Binding SaveCommand}" CommandParameter="{Binding Path=Employee}" Content="Сохранить" HorizontalAlignment="Right"
Margin="0,0,102,10" VerticalAlignment="Bottom" Width="75"/>
        <Button IsCancel="True" Content="Отмена" Margin="0,0,22,10" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75" />
    </Grid>
</Window>



Код: 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 class EmployeeViewModel
{
    private IDataContext Context;
    private IWindowService Service;

    public EmployeeViewModel()
    {
        Context = new DataContext(); // todo IoC resolve
        Service = new WindowService(); // todo IoC resolve
    }

    public Employee Employee { get; set; }

    public ICommand SaveCommand
    {
        get
        {
            return new RelayCommand((action) =>
            {
                Context.UpdateEmployee(action as Employee);
                Service.CloseActiveWindow();
            });
        }
    }
}

...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460129
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460261
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проще для формы редактирования запросить с сервера свою копию записи, или клонировать текущую из грида. При применении в форме заменить текущую запись в гриде на запись из формы редактирования.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460267
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЯ конечно могу подтасовать новый экземпляр и намапить его свойства из предыдущего, тогда у меня будут разные объекты.Упс, не заметил. :-)
МСУНо как-то это жестоко…Жестоко - это видеть в основной форме с гридом незакоммиченные изменения из формы редактирования.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460300
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К, ну вообщем да, так и сделал. Но гложет сомнение, что можно как-то нечерезжопно сделать... :)

EmployeesViewModel
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public ICommand EmployeeSelectCommand
{
    get
    {
        return new RelayCommand((action) =>
        {
            if (PropertyChanged != null && action != null)
            {                        
                if (Service.OpenEmployeeDetailWindow(action as Employee))
                {
                    // Нажали сохранить - обновляемся
                    PropertyChanged(this, new PropertyChangedEventArgs("Employees"));
                }
            }
        });
    }
}




EmployeesViewModel
Код: 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.
public class EmployeeViewModel
{
    private IDataContext Context;
    private IWindowService Service;

    public EmployeeViewModel()
    {
        Context = new DataContext(); // todo IoC resolve
        Service = new WindowService(); // todo IoC resolve
    }

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

    public ICommand SaveCommand
    {
        get
        {
            return new RelayCommand((action) =>
            {
                var vm = action as EmployeeViewModel;
                Context.UpdateEmployee(vm.EmployeeId, vm.FirstName, vm.LastName);
                Service.CloseActiveWindow(true);
            });
        }
    }
}



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<Window>
    <Grid>
        <TextBox Text="{Binding LastName}" HorizontalAlignment="Left" Height="23" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="300"/>
        <Button Command="{Binding SaveCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext}" Content="Сохранить" HorizontalAlignment="Right" Margin="0,0,102,10" VerticalAlignment="Bottom" Width="75"/>
        <Button IsCancel="True" Content="Отмена" Margin="0,0,22,10" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75" />
        <TextBox Text="{Binding FirstName}" HorizontalAlignment="Left" Height="23" Margin="10,38,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="300"/>
    </Grid>
</Window>



Лёня, попинай, если что :)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460307
Monochromatique
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гкхм...

А не проще на команду сохранения и отмены "посадить" в конце чтение объекта из базы? Просто в случае отмены - не сохранять.

И IEditableObject - разве не для чего-то такого "придуман"?
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460311
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ// Пачка дублирующего уныния, вместо пряморукого объекта 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; }
}
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460337
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЛёня, попинай, если что :)Забудь на время про "MVVM бэстпрактик". Накидай прототип приложения с логикой в code-behind. Потом выноси код из code-behind во ViewModel по мере необходимости. Так будет лучше, поверь мне. :-)

зы: Будут проблемы с биндингом из XAML на code-behind - спрашивай, подскажу, решения есть...
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460379
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКто как решает такую задачу?

Как принято красиво при нажатии кнопка “Отмена” (ESC или крестик) вернуть обратно первоначальное значение выделенной строки грида?

Я конечно могу подтасовать новый экземпляр и намапить его свойства из предыдущего, тогда у меня будут разные объекты. Но как-то это жестоко…

Ряд товарисчей считают, что такая штука реализуется через Undo/Redo, постороенном на основе Command pattern - как-то так . Писанины много конечно, но вроде как для этого есть отдельные фреймворки - типа вот этого: http://muf.codeplex.com/. Разумеется, при нежелании тащить в свой проект сторонние компоненты, можно написать свой.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460384
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MonochromatiqueА не проще на команду сохранения и отмены "посадить" в конце чтение объекта из базы? Просто в случае отмены - не сохранять.
Как-то сложно. У меня на отмене вообще ничего не сидит.

MonochromatiqueИ IEditableObject - разве не для чего-то такого "придуман"?
Вариант, да.

Алексей КЯ бы не стал без необходимости дублировать поля модели во вьюмодели.
Так тоже самое получается. Мне нужно заново перемапить Employee, чтобы он "отвязался" от грида. Но в принципе, согласен.

Алексей КПотом выноси код из code-behind во ViewModel по мере необходимости. Так будет лучше, поверь мне. :-)
Не хочу :)

Алексей Кзы: Будут проблемы с биндингом из XAML на code-behind - спрашивай, подскажу, решения есть...
Ок, спс :)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460388
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныРяд товарисчей считают, что такая штука реализуется через Undo/Redo, постороенном на основе Command pattern - как-то так . Писанины много конечно, но вроде как для этого есть отдельные фреймворки - типа вот этого: http://muf.codeplex.com/. Разумеется, при нежелании тащить в свой проект сторонние компоненты, можно написать свой.
Стараюсь делать нативщиной, у меня даже RelayCommand свой :)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460412
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУСтараюсь делать нативщиной, у меня даже RelayCommand свой :)Одобряю. :-)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460428
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще этот xaml какой-то хрупковатый, чуть пукнул в сторонке, завалилось к ебени всё вью - мвц поприятнее будет :)
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460435
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУСтараюсь делать нативщиной, у меня даже RelayCommand свой :)
Это нормально, каждый впф-ник имеет в заначке свой собственный самописный фреймворк, даже если использует еще какие-то другие. У меня тоже есть такое.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460436
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУВообще этот xaml какой-то хрупковатый, чуть пукнул в сторонке, завалилось к ебени всё вьюЭто поначалу, потом привыкнешь. :-)
МСУмвц поприятнее будет :)Чему там ломаться? Там дизайнера в принципе нету. Может оно и правильно...
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460438
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныМСУСтараюсь делать нативщиной, у меня даже RelayCommand свой :)
Это нормально, каждый впф-ник имеет в заначке свой собственный самописный фреймворк, даже если использует еще какие-то другие. У меня тоже есть такое.+1
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460452
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныМСУСтараюсь делать нативщиной, у меня даже RelayCommand свой :)
Это нормально, каждый впф-ник имеет в заначке свой собственный самописный фреймворк, даже если использует еще какие-то другие. У меня тоже есть такое.
Это да, но я должен реально прочувствовать, что без того или иного фреймворка спокойного жить не получится. Пока не вижу такой необходимости в использовании сторонних грабель. Возможно потом изменится мнение...

Алексей КЧему там ломаться? Там дизайнера в принципе нету. Может оно и правильно...
Ну дизайнер есть у WebForms, дизайнер - это хорошо. Основной минус замла от хтмл в том, что нельзя прям в студийной отладке править декларативнщину. Бесит всё время стопить апп :(
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460500
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЧему там ломаться? Там дизайнера в принципе нету. Может оно и правильно...
Ну дизайнер есть у WebForms,Ты говорил про МВЦ.
МСУдизайнер - это хорошо.Не всегда. Поддержка дизайнера требует определённых жертв. Это было особенно актуально в WinForms. К счастью, этот ужас давно в прошлом. :-)

В WPF дизайнер тоже, бывает, даёт о себе знать, но редко.

Впрочем, я отвык от дизайнера. Привык писать XAML вручную. Такой подход тоже имеет свои преимущества.
МСУОсновной минус замла от хтмл в том, что нельзя прям в студийной отладке править декларативнщину. Бесит всё время стопить апп :(В VS2010 бесят тормоза дизайнера. В более поздних VS это обещали поправить. К сожалению, использовать их не могу, WinXP сцукко.
...
Рейтинг: 0 / 0
Получения данных из DataGrid WPF MVVM
    #38460523
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КТы говорил про МВЦ.
А в мвц запрещено использовать винформз?

Алексей КНе всегда. Поддержка дизайнера требует определённых жертв. Это было особенно актуально в WinForms. К счастью, этот ужас давно в прошлом. :-)
Не понимаю, о каких жертвах идет речь? :)

Алексей КВпрочем, я отвык от дизайнера. Привык писать XAML вручную. Такой подход тоже имеет свои преимущества.
Согласен. Но первоначально выбрать компонент из палитры, положить его, отцентрировать, задать через F2 название той же кнопки - весьма приятно.

Алексей КВ VS2010 бесят тормоза дизайнера. В более поздних VS это обещали поправить. К сожалению, использовать их не могу, WinXP сцукко.
Уже больше года не трогал десятку... Сейчас 12 и 13 студия.
...
Рейтинг: 0 / 0
25 сообщений из 450, страница 1 из 18
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Получения данных из DataGrid WPF MVVM
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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