Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120

Скрыть/показать RowDetailsTemplate по клику на строке DataGrid MVVM

25.07.2020, 22:50. Показов 3129. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не получается сделать так, чтоб при первом клике на строку просто выбирался элемент, при повторном нажатии показывался RowDetailsTemplate а при последующем скрывалось и так дальше показывалось/скрывалось.. Можно также при двойном клике скрывать/показывать RowDetailsTemplate, а при обычном клике просто выделялась строка. Как это сделать?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.07.2020, 22:50
Ответы с готовыми решениями:

Как при использовании свойства DataGrid.RowDetailsTemplate вызвать команду? MVVM
Есть таблица с определенными данными допустим пусть в каждой строке будут два значения a и b надо чтобы в RowDetailsTemplate выводился...

Скрыть и показать кнопку по клику
Задача скрывать кнопку по клику на нее и показывать ее же по клику на другой элемент страницы или просто по любому месту страницы. Скрывать...

Показать / скрыть изображение по клику
Привет всем!) Помогите пожалуйста доработать скрипт. Сделал скрипт, он при клике по <code> отображает и скрывает изображение, но...

11
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
26.07.2020, 12:19
SetAres, вот совсем не понятно причём здесь MVVM?

То есть у вас есть работающий код, но вам его надо реализовать в паттерне MVVM?

Где этот код? И что в нём вас смущает?
2
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
26.07.2020, 22:50  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
SetAres, вот совсем не понятно причём здесь MVVM?
Необходимо по клику на строке реализовать сворачивание разворачивание RowDetailsTemplate в рамках паттерна MVVM (находил кучу вариантов как это сделать с помощью CB, но мне надо чтоб CB был чистым)

В итоге решил как-то:
В разметке DataGrid привязал команду на двойной клик:
XML
1
2
3
4
       
<DataGrid.InputBindings>              
   <MouseBinding Gesture="LeftDoubleClick" Command="{Binding IsExpanded}"/>          
</DataGrid.InputBindings>
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
     
private RelayCommand isExpanded;
public RelayCommand IsExpanded
{
        get
        {
                return isExpanded ?? (isExpanded = new RelayCommand((obj) =>
                {
                    if (RowVisibility)
                        RowVisibility = false;
                    else
                        RowVisibility = true;
                }));
        }
}
 
private bool rowVisibility = false;
public bool RowVisibility
{
        get { return rowVisibility; }
        set
        {
                rowVisibility = value;
                OnPropertyChanged();
        }
}
И к свойству RowDetailsVisibilityMode датагрида привязал свойство RowVisibility в ViewModel:
XML
1
<DataGrid RowDetailsVisibilityMode="{Binding RowVisibility, Converter={StaticResource RowDetailsVisibilityConverter}}>
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
26.07.2020, 23:00
Цитата Сообщение от SetAres Посмотреть сообщение
Необходимо по клику на строке реализовать сворачивание разворачивание RowDetailsTemplate в рамках паттерна MVVM
Или я не понимаю, что вы хотите сделать....
Или вы не понимаете, что такое MVVM.

MVVM задаёт правила разделяющие слои для работы с Данными (Модель), для Представления Данных (View), для связи Модель и View (ViewModel).
Всё, что делается в View, но не влияет на данные не имеет отношения в MVVM.

Объясните каким образом сворачивание разворачивание RowDetailsTemplate влияет (или должно влиять) на Данные, находящиеся в Модели?


Может вы имеете ввиду не MVVM, а рекомендацию создавать Окна полностью в XAML с пустым Code Behind ?
Такая рекомендация есть и её действительно лучше соблюдать, но это рекомендация не имеет отношения к MVVM.
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
26.07.2020, 23:24  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Может вы имеете ввиду не MVVM, а рекомендацию создавать Окна полностью в XAML с пустым Code Behind ?
Да, именно это я и имел ввиду. И почему-то у меня это ассоциируется именно с MVVM, когда идёт разделение слоёв, когда Code Behind пуст.. Учту

А задачу по другому объяснить не смогу - "сворачивание разворачивание RowDetailsTemplate" по двойному клику. По умолчанию кликая по строке DataGrid (когда есть детали и используется RowDetailsTemplate), можно увидеть панель с деталями, но порой их надо скрыть. Вот я и хотел это реализовать.
0
Жесток & Наивен
 Аватар для sanec38
483 / 188 / 91
Регистрация: 02.02.2017
Сообщений: 427
27.07.2020, 07:52
Не совсем понял, но мб использовать DataTrigger и если триггер сработает подменить реализацию RowDetailsTemplate на другую.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
27.07.2020, 16:59
Лучший ответ Сообщение было отмечено SetAres как решение

Решение

Цитата Сообщение от SetAres Посмотреть сообщение
Да, именно это я и имел ввиду. И почему-то у меня это ассоциируется именно с MVVM, когда идёт разделение слоёв, когда Code Behind пуст.. Учту
Самый простой способ сделайте контейнер с данными для команды
C#
1
2
3
4
5
6
7
8
9
public class InvertCommand : OnPropertyChangеdClass
{
    public InvertCommand() => Command = new RelayCommand(Method);
    public RelayCommand Command {get;}
    private void Method(object parameter) => Value = ! Value;
 
    private bool _value = false;
    public bool Value {get => _value; set => SetProperty(ref _value, value);}
}
Объявляете в ресурсах экземпляр этого контейнера
XML
10
11
12
<Windows.Resources>
    <local:InvertCommand x:Key="RowVisibilityInvert"/>
</Windows.Resources>
И в привязках обращаетесь к этому экземпляру
XML
1
2
3
4
       
<DataGrid.InputBindings>              
   <MouseBinding Gesture="LeftDoubleClick" Command="{StaticResources RowVisibilityInvert.Command}"/>          
</DataGrid.InputBindings>
XML
1
2
3
4
<DataGrid RowDetailsVisibilityMode=
     "{Binding Value, 
        Source={StaticResources RowVisibilityInvert},
        Converter={StaticResource RowDetailsVisibilityConverter}}>
Добавлено через 2 минуты
Можете задать в контейнере значение не bool, а типа DataGridRowDetailsVisibilityMode.
Тогда конвертер в привязке не будет нужен.

Добавлено через 6 минут
C#
1
2
3
4
5
6
7
8
9
10
11
public class RowDetailsCommand : OnPropertyChangеdClass
{
    public RowDetailsCommand() => Command = new RelayCommand(Method);
    public RelayCommand Command {get;}
    private void Method(object parameter) => Details = Details == DataGridRowDetailsVisibilityMode.Collapsed
                             ? DataGridRowDetailsVisibilityMode.VisibleWhenSelected
                             : DataGridRowDetailsVisibilityMode.Collapsed;
 
    private DataGridRowDetailsVisibilityMode _details = false;
    public DataGridRowDetailsVisibilityMode Details {get => _details ; set => SetProperty(ref _details , value);}
}
XML
1
2
3
<Windows.Resources>
    <local:RowDetailsCommand  x:Key="RowDetailsVisibility"/>
</Windows.Resources>
XML
1
2
3
<DataGrid RowDetailsVisibilityMode=
     "{Binding Details, 
        Source={StaticResources RowDetailsVisibility}}>
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
16.08.2020, 16:45  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Самый простой способ сделайте контейнер с данными для команды
Не могу разобраться с ошибками(
C#
1
2
3
private Method(object parameter) => Value = !Value; - // Method must have a return type
 
public bool Value { get => _value; set => SetProperty(ref _value, value); } - //The name 'SetProperty' does not exist in the current context
Какой смысл наследоваться от OnPropertyChangеdClass? (Если я правильно понял, то это класс, содержащий в себе свойства, отображающиеся в строках DataGrid?)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
16.08.2020, 17:32
Цитата Сообщение от SetAres Посмотреть сообщение
Какой смысл наследоваться от OnPropertyChangеdClass?
Реализация INotifyPropertyChanged (INPC).
Без этого интерфейса, изменение значений свойств может быть не отображено в Представлении.
Чтобы не делать каждый раз по новой реализацию INPC и создан базовый класс с ней.

Добавлено через 1 минуту
Цитата Сообщение от SetAres Посмотреть сообщение
The name 'SetProperty' does not exist in the current context
Этот метод из Новая реализация OnPropertyChangedClass [WPF, Элд Хасп].

Если не наследовать от него, то метода не будет.
Если используете какой-то фрамеворк для базового класса VM, то возможно в нём аналогичный метод называется по иному.
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
16.08.2020, 19:02  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Реализация INotifyPropertyChanged (INPC).
Без этого интерфейса, изменение значений свойств может быть отображено в Представлении.
Чтобы не делать каждый раз по новой реализацию INPC и создан базовый класс с ней.
Теперь понятно. Вопрос по методу "Method"- он должен возвращать тип bool? Если да, то появляется ошибка в строке

C#
1
public InvertCommand() => Commnad = new RelayCommand(Method); // 'bool InvertCommand.Method(object)' has the wrong return type
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
16.08.2020, 19:22
Цитата Сообщение от SetAres Посмотреть сообщение
Вопрос по методу "Method"- он должен возвращать тип bool?
Команда - это реализация интерфейса ICommand.

В RelayCommand надо обязательно передавать исполнительный метод команды void Method(object parameter).
И вторым параметром, может быть передан метод проверки состояния команды bool CanMethod(object parameter).

Инициализация команд обычно делают одним из способов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
private RelayCommand _myCommand;
public RelayCommand MyCommand => _myCommand
    ?? (_myCommand = new RelayCommand(MyMethod, MyCanMetod)); // MyCanMetod - можно пропустить
private void MyMethod(object parameter)
{
    // Тело метода
}
private bool MyCanMethod(object parameter)
{
    // Тело метода
   return ....; // bool значение
}
Или в конструкторе класса
C#
1
2
3
4
5
6
7
8
9
10
public class MyClass
{
   public MyClass
   {
       MyCommand = new RelayCommand(MyMethod, MyCanMetod));
   }
   public RelayCommand MyCommand {get;}
   private void MyMethod(object parameter){}
   private bool MyCanMethod(object parameter){}
}
1
1 / 1 / 0
Регистрация: 17.12.2017
Сообщений: 120
16.08.2020, 21:12  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Команда - это реализация интерфейса ICommand.
Со всем разобрался, спасибо большое.
Оказывается у меня было именно так и реализованно, только с использованием конвертера. Но OnPropertyChangеdClass ввёл меня в заблуждение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.08.2020, 21:12
Помогаю со студенческими работами здесь

Скрыть, показать объект по клику, когда много блоков
Создал сетку GRID и столкнулся с двумя проблемами. 1) Когда внутри блока GRID создаю еще один блок с классом, то он выводится на экран...

Привязка данных к DataGrid внутри DataGrid.RowDetailsTemplate
Это может показаться запутанным,но постарайтесь понять. У меня есть List в котором хранятся объекты в которых тоже есть...

DataGrid. Скрыть/показать строки по условию
На прикреплённой картинке имеется DataGrid, который содержит 2 столбца, первый - название параметра, а второй -значение. Вопрос: как...

dataGrid binding связанные таблицы RowDetailsTemplate
Приветствую! Помогите, пожалуйста, выйти из тупика: Есть 2 таблицы, логически связанный по GUID: 1. guid | field11 | field12 | ... |...

По клику в элементе DataGrid отобразить информацию о строке
День добрый форумчане! Переписываю приложение с WinForms на ASP. Собственно есть DataGrid, данные в него добавляю указывая в DataSource...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru