Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/63: Рейтинг темы: голосов - 63, средняя оценка - 4.95
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329

Предотвратить всплытие выполнения команды привязанной к MouseDoubleClick

27.08.2021, 18:06. Показов 13322. Ответов 99

Студворк — интернет-сервис помощи студентам
Добрый день, подскажите пожалуйста, как предотвратить всплытие выполнения команды по двойному клику от дочернего выделенного объекта до родительского.
Структура следующая, упростил для кратности
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<ListBox ItemsSource="{Binding Path=Roots,BindsDirectlyToSource=True}" SelectedItem="{Binding Path=SelectedItemRoot, Mode=TwoWay}" ScrollViewer.CanContentScroll="False">
 <i:Interaction.Triggers>
     <i:EventTrigger EventName="MouseDoubleClick">
         <i:InvokeCommandAction Command="{Binding SelectedItemRoot.ShowEditDialogCommand}/>
     </i:EventTrigger>
 </i:Interaction.Triggers>
    <ListBox.ItemTemplate> 
         <ListBox ItemsSource="{Binding Path=Children}"  SelectedItem="{Binding Path=SelectedItemChild, Mode=TwoWay}" >
            <i:Interaction.Triggers>
               <i:EventTrigger EventName="MouseDoubleClick">
                   <i:InvokeCommandAction Command="{Binding SelectedItemChild.ShowEditDialogCommand}/>
               </i:EventTrigger>
            </i:Interaction.Triggers>
            <ListBox.ItemTemplate /> 
          </ListBox>
     </ListBox.ItemTemplate>
</ListBox>
При выборе дочернего элемент списка SelectedItemChild, происходит выбор родительского элемента SelectedItemRoot, по скольку тот в нем находится

При двойном клике по ItemChild выполняется команда ItemChild.ShowEditDialogCommand, в которой происходит вызов модального окна предназначенного для редактирования ItemChild.
По закрытию этого модального окна, происходит автоматическое открытие модального окна у родителя ItemRoot.ShowEditDialogCommand - т.е выполняется команда родителя, хотя я не кликал два раза по родителю

Как предотвратить это всплытие выполнения команд ?

Даже скажу так, выполняются все команды выделенных объектов, по очереди, хотя кликал я только по одному
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.08.2021, 18:06
Ответы с готовыми решениями:

WPF команды и MVVM. Часть 2. Всплытие команд. Реализация команды для списка элементов [WPF, Элд Хасп]
Тема из цикла https://www.cyberforum.ru/wpf-silverlight/thread2384523.html На практике часто встречаются случаи когда команда и кнопка...

После выполнения определённой команды не выполняются последующие команды
Объясните, пожалуйста, почему может останавливаться выполнение второй и далее комманд? cd C:\Users\alex_iv\Desktop\test_node\ node...

Как предотвратить выполнения функции в определенных случаях?
Никак не могу понять в чем проблема моего кода. По сабжу - есть текстовый файл с записанными значениями, каждое с новой строки и есть...

99
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
31.08.2021, 22:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от UseMuse Посмотреть сообщение
Есть еще за что глаз цепляется?
В первую очередь - отсутствие Модели.
В каком-то виде её может играть класс DBHelper.
Но нужно создавать его экземпляр и потом внедрять его в VM.

Так же вам без изначально правильной его состыковки с БД будет очень потом его адаптировать его.
В простейшем случае, лучше его просто заменить на Контекст БД из EF.
Это хоть стандартный и широко известный класс.
А у вас, хроме хранения данных, и нет никакой иной Бизнес Логики.

Добавлено через 2 минуты
UseMuse, сейчас некогда.
Скиньте мне приглашение на EldHasp (автарка такая же как здесь).
Будет время - внесу кое какие правки.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
31.08.2021, 23:33  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
P.S. ViewModel надо инициализировать так, что Дизайне XAML видел её.
Или задавать данные Времени Конструирования.
А в CodeBehind нужно комментить следующие поля?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private ViewModelMain viewmodel;//это комментить?
 
        public MainWindow()
        {
            InitializeComponent();
            viewmodel = new ViewModelMain();//это комментить?
            DataContext = viewmodel;//это комментить?
        }
Если да, тогда у меня в дизайнере появляются данные, а когда запускаю приложение, данных нет
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
01.09.2021, 10:41
Цитата Сообщение от UseMuse Посмотреть сообщение
А в CodeBehind нужно комментить следующие поля?
В данном случае - нет.
Я поэтому и писал, что у вас "кривая" базовая VM.

В простейшем виде должны быть примерно такая реализация:
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
using System.ComponentModel;
using System.Runtime.CompilerServices;
 
namespace Simplified
{
    /// <summary>Делегат для сравнения двух экземпляров.</summary>
    /// <typeparam name="T">Тип экземпляров.</typeparam>
    /// <param name="left">Первый из сравниваемых объектов.</param>
    /// <param name="right">Второй из сравниваемых объектов.</param>
    /// <returns>Возвращает <see langword="true"/>  для одинаковых объектов.</returns>
    public delegate bool Equality<T>(T left, T right);
 
    /// <summary>Базовый класс с реализацией <see cref="INotifyPropertyChanged"/>.</summary>
    public abstract class BaseInpc : INotifyPropertyChanged
    {
        /// <inheritdoc cref="INotifyPropertyChanged"/>
        public event PropertyChangedEventHandler PropertyChanged;
 
        /// <summary>Защищённый метод для создания события <see cref="PropertyChanged"/>.</summary>
        /// <param name="propertyName">Имя изменившегося свойства. 
        /// Если значение не задано, то используется имя метода в котором был вызов.</param>
        protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
 
        /// <summary>Защищённый метод для присвоения значения полю и
        /// создания события <see cref="PropertyChanged"/>.</summary>
        /// <typeparam name="T">Тип поля и присваиваемого значения.</typeparam>
        /// <param name="propertyField">Ссылка на поле.</param>
        /// <param name="newValue">Присваиваемое значение.</param>
        /// <param name="propertyName">Имя изменившегося свойства. 
        /// Если значение не задано, то используется имя метода в котором был вызов.</param>
        /// <param name="equality">Делегат для сравнения значения поля с новым значением.</param>
        /// <remarks>Метод предназначен для использования в сеттере свойства.<br/>
        /// Сравнение нового значения со значением поля производится следующим образом:<br/>
        /// - Если оба равны <see langword="null"/>, то считаются равными;<br/>
        /// - Если один равен <see langword="null"/>, а другой нет, то считаются неравными;<br/>
        /// - Если оба не равны <see langword="null"/>, то сравниваются ссылки на объекты;<br/>
        /// - Если ссылки на разные объекты, то сравниваются делегатом <paramref name="equality"/>;<br/>
        /// - Если делегат <paramref name="equality"/> равен <see langword="null"/>, то сравниваются методом <see cref="object.Equals(object, object)"/>.<br/>
        /// Если присваиваемое значение не эквивалентно значению поля, то оно присваивается полю.<br/>
        /// После присвоения создаётся событие <see cref="PropertyChanged"/> вызовом
        /// метода <see cref="RaisePropertyChanged(string)"/>
        /// с передачей ему параметра <paramref name="propertyName"/>.<br/>
        /// После создания события вызывается метод <see cref="OnPropertyChanged(in string, in object, in object)"/>.</remarks>
        protected void Set<T>(ref T propertyField, T newValue, Equality<T> equality = null, [CallerMemberName] string propertyName = null)
        {
            bool isFieldNull = propertyField == null;
            bool isValueNull = newValue == null;
 
            bool isEquals = isFieldNull && isValueNull;
            if (!(isFieldNull || isValueNull))
            {
                isEquals = ReferenceEquals(propertyField, newValue) ||
                            (
                                equality != null
                                ? equality(propertyField, newValue)
                                : Equals(propertyField, newValue)
                            );
            }
 
            if (!isEquals)
            {
                T oldValue = propertyField;
                propertyField = newValue;
                RaisePropertyChanged(propertyName);
 
                OnPropertyChanged(propertyName, oldValue, newValue);
            }
        }
 
        /// <summary>Защищённый виртуальный метод вызывается после присвоения значения
        /// свойству и после создания события <see cref="PropertyChanged"/>.</summary>
        /// <param name="propertyName">Имя изменившегося свойства.</param>
        /// <param name="oldValue">Старое значение свойства.</param>
        /// <param name="newValue">Новое значение свойства.</param>
        /// <remarks>Переопределяется в производных классах для реализации
        /// реакции на изменение значения свойства.<br/>
        /// Рекомендуется в переопределённом методе первым оператором вызывать базовый метод.<br/>
        /// Если в переопределённом методе не будет вызова базового, то возможно нежелательное изменение логики базового класса.</remarks>
        protected virtual void OnPropertyChanged(in string propertyName, in object oldValue, in object newValue) { }
    }
}
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
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Threading;
 
namespace Simplified
{
    /// <summary>Базовый класс для ViewModel.</summary>
    public abstract class ViewModelBase : BaseInpc
    {
        /// <summary><see cref="Dispatcher"/> основного потока приложения.<br/>
        /// Инициализируется из свойства
        /// <see cref="Application.Current"/>.<see href="https://docs.microsoft.com/ru-ru/dotnet/api/system.windows.application?view=net-5.0#properties">Dispatcher</see>.</summary>
        public static Dispatcher DispatcherStatic { get; } = Application.Current.Dispatcher;
 
        /// <summary>Возвращает <see langword="true"/>, если обращение происходит
        /// во Время режима Разработки.<br/>
        /// Может использовать для создания Контекста Данных Времени Разработки
        /// отличного от Контекста Данных Времени Исполнения.<br/>
        /// Инициализируется значением возвращаемым методом
        /// <see cref="DesignerProperties.GetIsInDesignMode(DependencyObject)"/>
        /// для new DependencyObject().</summary>
        public static bool IsInDesignModeStatic { get; } = DesignerProperties.GetIsInDesignMode(new DependencyObject());
 
        /// <summary><see cref="Dispatcher"/> используемый в экземпляре <see cref="ViewModelBase"/>.<br/>
        /// Инициализируется значение свойства <see cref="DispatcherStatic"/>.<br/>
        /// В производных классах может быть, через конструкторы
        /// <see cref="ViewModelBase(Dispatcher)"/> и <see cref="ViewModelBase(Dispatcher, bool)"/>,
        /// задано другое значение.</summary>
        public Dispatcher Dispatcher { get; } = DispatcherStatic;
 
        /// <summaryВозвращает <see langword="true"/>, если обращение происходит
        /// во Время режима Разработки.<br/>
        /// Инициализируется значение свойства <see cref="IsInDesignModeStatic"/>.<br/>
        /// В производных классах может быть, через конструкторы
        /// <see cref="ViewModelBase(bool)"/> и <see cref="ViewModelBase(Dispatcher, bool)"/>,
        /// задано другое значение.</summary>
        public bool IsInDesignMode { get; } = IsInDesignModeStatic;
 
        /// <summary>Конструктор со значением свойств <see cref="Dispatcher"/>
        /// и <see cref="IsInDesignMode"/> заданными при инициализации.</summary>
        protected ViewModelBase() { }
 
        /// <summary>Конструктор со значением свойства
        /// <see cref="IsInDesignMode"/> заданным при инициализации.</summary>
        /// <param name="dispatcher">Значение для свойства <see cref="Dispatcher"/>.</param>
        protected ViewModelBase(Dispatcher dispatcher)
        {
            Dispatcher = dispatcher ?? throw new ArgumentNullException(nameof(dispatcher));
        }
 
        /// <summary>Конструктор со значением свойства
        /// <see cref="Dispatcher"/> заданным при инициализации.</summary>
        /// <param name="isInDesignMode">Значение для свойства <see cref="IsInDesignMode"/>.</param>
        protected ViewModelBase(bool isInDesignMode)
        {
            IsInDesignMode = isInDesignMode;
        }
 
        /// <summary>Конструктор с заданием значения обоих свойств.</summary>
        /// <param name="dispatcher">Значение для свойства <see cref="Dispatcher"/>.</param>
        /// <param name="isInDesignMode">Значение для свойства <see cref="IsInDesignMode"/>.</param>
        protected ViewModelBase(Dispatcher dispatcher, bool isInDesignMode)
            : this(dispatcher)
        {
            IsInDesignMode = isInDesignMode;
        }
    }
}
Тогда в экземпляре VM вы можете определять в каком режиме происходит обращение к нему и возвращать разные данные для разны режимов.

Примерно что-то в таком духе:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ViewModel
{
    private readonly Model model;
 
    private SomeData Data {get;}
 
    public ViewModel()
    {
        if (IsInDesignMode)
        {
            Data = new SomeData (....);
        }
        else
        {
            model = new Model();
            Data = model.GetData();
        }
    }
 }
Но у вас для VM времени исполнения используется параметрический конструктор.
Так как Модели у вас нет, то мне трудно судить насколько он нужен в действительности.
Но если он на самом деле нужен, то подобное нужно интерпретировать как "внедрение зависимости".
А этим обычно занимается App (не обязательно сам класс, а его уровень).
Так как View (Окно) ничего "не знает" о Модели (то есть о "настоящих" данных), то View и не может внедрять эту зависимость.

Во Время Разработки не нужно внедрять зависимости (или они иные), поэтому в VM, в этом случае, надо предусматривать разные конструкторы.
Именно такое решение я вам и предложил, как наименее затратное для уже имеющейся реализации.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
01.09.2021, 11:25  [ТС]
Элд Хасп,
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В нормальной типовой реализации команды находятся на уровне основной VM, а не в элементах её коллекций.
А у вас, вообще, команда забралась аж на уровень элемента коллекции в элементе коллекции.
Точно сказать о неверности такой реализации сказать не могу, поскольку не вижу саму реализацию и не знаю задачу.
Но попахивает от этого очень дурно.
Думаете нужно команду из ViewModelChildEdit переместить на уровень основной VM?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
01.09.2021, 11:55
Цитата Сообщение от UseMuse Посмотреть сообщение
Думаете нужно команду из ViewModelChildEdit переместить на уровень основной VM?
Это лучше, но вы не учитываете, что VM - это отражение Модели.
А Модели у вас нет и что она отражает?
То есть у вас поломана сама архитектура MVVM и поэтому трудно сказать как лучше.

Поэтому, пишу ещё раз, сделайте шаг назад.
Сначала создайте Модель.
Если у вас только простейшее GUI к БД, то вполне будет достаточно DbContext из EF для SQLite.
Потом, при необходимости, можете задать другой.

Без какой-то структуры отражающей данные, мне трудно даже просто понять что там за логика, что, с чем и как в ней связано.

Если трудно работать с EF, создайте какой-то XML и сериализацию для него.
1
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
01.09.2021, 14:59  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
protected void Set<T>(ref T propertyFiled, T newValue, Equality<T> equality = null, [CallerMemberName] string propertyName = null)
Можно пример использования с применением equality ?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
01.09.2021, 15:17
Цитата Сообщение от UseMuse Посмотреть сообщение
Можно пример использования с применением equality ?
С явным методом:
C#
1
2
3
4
5
private static bool PersonEquality (Person first, Person second)
   => first.Name ==  second.Name;
 
private Person _person;
public Person Person {get => _person; Set(ref _person, value, PersonEquality);}
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
01.09.2021, 15:17
UseMuse, я вчера редактировал код BaseInpc (сокращал его).
Сейчас смотрю и мне кажется, что что-то не то я наудалял.
Проверю сейчас и отпишу.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
01.09.2021, 15:21  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
if (IsInDesignMode)
Элд Хасп, Как сделать так, чтобы проект определял режим разработки? я запускаю проект в Debug, а поле IsInDesignMode = false
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
01.09.2021, 16:00
UseMuse, да так и есть.
Скобки в условии сравнения (внутри if) пропустил.

И лишнее условие в самом if - это не критично, но "грязь в коде".

Надо вместо:
C#
52
53
54
55
56
57
58
59
            bool isEquals = isFiledNull && isValueNull;
            if (!(isEquals || isFiledNull || isValueNull))
            {
                isEquals = ReferenceEquals(propertyFiled, newValue) ||
                            equality != null
                            ? equality(propertyFiled, newValue)
                            : Equals(propertyFiled, newValue);
            }
Вот так:
C#
52
53
54
55
56
57
58
59
60
61
            bool isEquals = isFiledNull && isValueNull;
            if (!(isFiledNull || isValueNull))
            {
                isEquals = ReferenceEquals(propertyFiled, newValue) ||
                            (
                                equality != null
                                ? equality(propertyFiled, newValue)
                                : Equals(propertyFiled, newValue)
                            );
            }
В полный код внёс исправление ошибки.
Скопируйте его по новой.

Добавлено через 7 минут
Цитата Сообщение от UseMuse Посмотреть сообщение
Как сделать так, чтобы проект определял режим разработки? я запускаю проект в Debug, а поле IsInDesignMode = false
Режим Времени Разработки - это Режим когда вы правите код (XAML) в Студии (в Конструкторе XAML).
После запуска (не важно Debug или Release) - это Режим Исполнения.

Для чего это нужно.
Допустим у вас в Режиме Исполнения подгружаются данные из БД.
Но в Режиме Разработки эта БД "не видна" и при погрузке данных возникает исключение.
Соответственно, в Конструкторе XAML вы видите предупреждение (обычно подчёркивается синей линией конструктор VM), а Окно пусто - без данных.
И вам не понятно как оно будет выглядеть с данными.

В таком случае по флагу режима вы вместо реальных данных из БД загружаете в VM демонстрационные Данные.
Запроса к БД не происходит, исключения не возникает и вы в Конструкторе XAML видите Окно с Данными.

Добавлено через 12 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
я запускаю проект в Debug
Если вам нужно во Время Исполнения отличать Debug от Release, то это не проблема сделать.
Но это нужно делать в основном проекте, а не в библиотеке.
Библиотека может быть скомпилирована в Release, а проект её использующий будет скомпилирован в Debug.


Добавьте в Code Behind App следующий код:
C#
12
13
14
15
16
17
18
19
20
    /// <summary>
    /// Логика взаимодействия для App.xaml
    /// </summary>
    public partial class App : Application
    {
        public static bool IsDebug { get; }
#if DEBUG
        = true;
#endif
И проверяйте статическое свойство App.IsDebug во время исполнения.
Хотя, честно говоря, не приходит в голову для чего это может понадобиться.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,755
Записей в блоге: 4
01.09.2021, 16:35
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Хотя, честно говоря, не приходит в голову для чего это может понадобиться.
Писать сообщения в Output к примеру.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
01.09.2021, 19:53
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Писать сообщения в Output к примеру.
Так пишите.
Он сам в Release отключится.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
08.09.2021, 10:23  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Скиньте мне приглашение на EldHasp (автарка такая же как здесь).
Будет время - внесу кое какие правки.
Кинул
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
08.09.2021, 12:26
Цитата Сообщение от UseMuse Посмотреть сообщение
Кинул
Получил.
Как будет время - займусь.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
11.09.2021, 14:42
UseMuse, начал рефакторинг.
Делаю небольшими шагами, чтобы вы могли отследить изменения и понять их.
Поэтому смотрите не только итоговую фиксацию, но и все промежуточные.

Добавлено через 4 минуты
Фиксация a7bc5ae2:
Добавил проект с базовыми реализация команд, INPC и ViewModel.
В проекте изменил наследование всех VM на класс из добавленного проекта.
Немного (по ходу) почистил код от лишних зависимостей.
Добавлено через 30 минут
Фиксация 6e08d9c4:
Убраны классы команд зависимые от VM и View.
Вместо них создаются нормальные экземпляры базовых классов.
Добавлено через 35 минут
Фиксация ccb52685:
Частично убраны зависимости VM от View
Добавлено через 29 минут
Фиксация 5cd4c679:
Добавлены код препятствующий всплытию даблклика.
Добавлены данные Времени Разработки.
Получение Данных (Модели) скрыто от View.
Добавлено через 10 минут
Фиксация d4897dd1:
Чистка кода.
На этом начальный рефакторинг завершаю.
Разберитесь с внесёнными изменениями.
Отпишите что поняли и что нет.
Потом продолжу.
1
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
13.09.2021, 15:04  [ТС]
Элд Хасп, при редактировании корневого элемента (двойном клике), получаю ошибку
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
13.09.2021, 15:19
UseMuse, будет время - посмотрю.
С изменениями разобрались, всё понятно?
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
13.09.2021, 15:56  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
С изменениями разобрались, всё понятно?
Изучаю

Добавлено через 24 минуты
Элд Хасп,

Любой объект

При взятии на редактирование объекта, в диалоге редактирования, в поле Title отсутствуют данные

При взятии на редактирование объекта, в диалоге редактирования, при изменении Title и нажатии отмены - отображается изменённый текст, хотя должен остаться тот который был.

Корневой объект

При взятии на редактирование корневого объекта, в диалоге редактирования, при изменении Title и нажатии ОК, данные не сохраняются
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
13.09.2021, 20:07
UseMuse, будет время - посмотрю.
С изменениями разобрались, всё понятно?
Цитата Сообщение от UseMuse Посмотреть сообщение
При взятии на редактирование объекта, в диалоге редактирования, в поле Title отсутствуют данные
Посмотрите как работают команды, какие данные в них поступают и каких не хватает.

Добавлено через 19 минут
Фиксация d7220b6b:
Исправлен баг с пропущенной инициализацией свойства ViewModelChildEdit.Title.
Добавлено через 6 минут
Фиксация 759e898e:
Удалено запоминание значения в команде ViewModelChildEdit.CloseCommand.
Добавлено через 3 минуты
Цитата Сообщение от UseMuse Посмотреть сообщение
При взятии на редактирование корневого объекта, в диалоге редактирования, при изменении Title и нажатии ОК, данные не сохраняются
Я этот блок не понял.
Скопировал вашу логику, но может что-то не так сделал.
Посмотрите в классе ViewModelRootEdit вот эти строки:
C#
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
            SaveCommand = new RelayCommand(
                () =>
                {
                    if (DBHelper.SyncRoot(data))
                        exit();
                    else
                    {
                        ErrorMessage = "Ошибка сохранения";
                    }
                },
                () =>
                {
                    bool canExecute = data.Title != Title;
                    return canExecute;
                }
            );
Поставьте в них точку останова и посмотрите как работает команда.

Добавлено через 12 минут
Фиксация bd53c398:
Исправлен код команд в ViewModelRootEdit.
0
 Аватар для UseMuse
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,329
13.09.2021, 23:27  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
SaveCommand = new RelayCommand(
                () =>
                {
                    if (DBHelper.SyncRoot(data))
                        exit();
                    else
                    {
                        ErrorMessage = "Ошибка сохранения";
                    }
                },
                () =>
                {
                    bool canExecute = data.Title != Title;
                    return canExecute;
                }
            );
после того, как данные были изменены, нужно произвести обновление этих данных на сервере, этот блок имитация выполнения обновления изменённых данных на сервере

Добавлено через 12 минут
Элд Хасп, при сохранении изменённых дочерних данных и вызова метода синхронизации обновления данных на сервере, добавил случайное выбрасывание ошибки, в тот момент ,когда возможна ошибка, диалог редактирования данных не должен закрываться, а должен оставаться открытым, при возникновении ошибки - в этом диалоге просто пишится о том, что произошла ошибка. Диалог редактирование нужна закрывать только при успешном обновлении или при отмене.
Ожидаемое поведение: как при редактировании корневого - при ошибке диалог не закрывается, в диалоге выводится ошибка.
Добавил обновлений в проект
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.09.2021, 23:27

Вывести результат выполнения команды HELP в текстовый файл так, чтобы у каждой команды был порядковый номер
Всем привет, нужна помощь! Необходимо команду help вывести в текстовый документ, чтобы у каждой команды был свой порядковый номер. ...

Как предотвратить зависание приложения во время коннекта и выполнения запроса в БД
Как лучше всего сделать что бы приложение не зависало во время выполнения запроса? Например есть некий коннект к ораклу и функция,...

Как предотвратить переподключение SignalR-клиента после выполнения ajax-запроса?
Добрый день. Использую SignalR для реалтайм приложения на ASPnet-MVC. В приложении пользователь должен загрузить файл на сервер. ...

Написать команды выполнения
1. Использовать порты F0/8-9 для передачи трафика VoIP 2. Отключите автосогласование на интерфейсах коммутаторов в сторону...

Ограничение выполнения команды
Здравствуйте, выполняю команду на питон, система линукс. Команда слушает mqtt сервер и возвращает прочитанное сообщение. Но когда сервер не...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru