Сообщение Непонятное поведение WPF Шаблон MVVM от 05.03.2021 1:27
Изменено 05.03.2021 3:21 Разраб
Непонятное поведение WPF VMMV
на главной форме такая кнопка
по умолчанию она задисаблема ( ProcessingNewPacket = new Command(action, canExecute = () => AllowProcessingNewPacket); ) вычисляемым методом canExecute.
из другого потока вызываю обработчик события
Кнопка должна активироваться, но она все равно серая, и только ткнув в какое-то поле или если окно было не видимо, т.е. ткнув в панели задач
кнопка активируется. при этом по серой кнопке если жамкнуть она естественно отработает.
Может кто знает как это лечится?
<StackPanel
<Button
Command="{Binding ProcessingNewPacket}"
/>
по умолчанию она задисаблема ( ProcessingNewPacket = new Command(action, canExecute = () => AllowProcessingNewPacket); ) вычисляемым методом canExecute.
из другого потока вызываю обработчик события
//System.Windows.Application.Current.Dispatcher
dispatcher.Invoke(delegate
{
OnPropertyChanged(nameof(AllowProcessingNewPacket));
});
Кнопка должна активироваться, но она все равно серая, и только ткнув в какое-то поле или если окно было не видимо, т.е. ткнув в панели задач
кнопка активируется. при этом по серой кнопке если жамкнуть она естественно отработает.
Может кто знает как это лечится?
Непонятное поведение WPF Шаблон MVVM
на главной форме такая кнопка
по умолчанию она задисаблема ( ProcessingNewPacket = new Command(action, canExecute = () => AllowProcessingNewPacket); ) вычисляемым методом canExecute.
из другого потока вызываю обработчик события
Кнопка должна активироваться, но она все равно серая, и только ткнув в какое-то поле или если окно было не видимо, т.е. ткнув в панели задач
кнопка активируется. при этом по серой кнопке если жамкнуть она естественно отработает.
Может кто знает как это лечится?
Выкрутился вот так:
Но это капец, конечно! Вообще, Шаблон MVVM сильно переусложнен. Есть опыт Winforms и web(vuejs, svelte).
По ощущениям Winforms была лучшей технологией мс за последние 20 лет.
Вот только яп хилый слишком. нужны минимум макросы времени компиляции(АОП) для избавления от необходимости везде писать Inotify и try\catch\log.
ну рельно вот в свелте, все что в компоненте экспортируется при помощи мета автоматически слушается движком. и зачем так далеко разнесли окно и модель. в итоге вот такой кошмар приходится городить.
Надо глянуть avalonia может там попроще вся эта лабуда работает.
<StackPanel
<Button
Command="{Binding ProcessingNewPacket}"
/>
по умолчанию она задисаблема ( ProcessingNewPacket = new Command(action, canExecute = () => AllowProcessingNewPacket); ) вычисляемым методом canExecute.
из другого потока вызываю обработчик события
//System.Windows.Application.Current.Dispatcher
dispatcher.Invoke(delegate
{
OnPropertyChanged(nameof(AllowProcessingNewPacket));
});
Кнопка должна активироваться, но она все равно серая, и только ткнув в какое-то поле или если окно было не видимо, т.е. ткнув в панели задач
кнопка активируется. при этом по серой кнопке если жамкнуть она естественно отработает.
Может кто знает как это лечится?
Выкрутился вот так:
//System.Windows.Application.Current.Dispatcher
dispatcher.Invoke(delegate
{
OnPropertyChanged(nameof(AllowProcessingNewPacket));
CommandManager.InvalidateRequerySuggested();
});
Но это капец, конечно! Вообще, Шаблон MVVM сильно переусложнен. Есть опыт Winforms и web(vuejs, svelte).
По ощущениям Winforms была лучшей технологией мс за последние 20 лет.
Вот только яп хилый слишком. нужны минимум макросы времени компиляции(АОП) для избавления от необходимости везде писать Inotify и try\catch\log.
ну рельно вот в свелте, все что в компоненте экспортируется при помощи мета автоматически слушается движком. и зачем так далеко разнесли окно и модель. в итоге вот такой кошмар приходится городить.
Надо глянуть avalonia может там попроще вся эта лабуда работает.