Есть RelayCommand из MvvmLight на него забиндена кнопка, вроде как все работает.
public RelayCommand MyCommand {get;}
public MyClass( IMyInterface service)
{
MyCommand = new RelayCommand(()=>DoSomething(), ()=>
{
Debug.Writeline("CanExecute");
var result = service.Check();
Debug.Writeline("CanExecute {result}");
return result;
});
}
Но в определенных обстоятельствах кнопка становится IsEnabled=false, причем стоят логи на CanExecute и его вызов в момент Disable не происходит последний залогированный вызов — true.
Стили все убраны, стандартные.
В output пишутся все события binding, там ничего нету из ошибок , есть немного Information 10 что хотят FallbackValue, но насколько мне известно это биндинги не ломает.
Как отладить из-за чего состояние кнопки меняется на disabled ?
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
У них есть 2 namespace: GalaSoft.MvvmLight.Command и GalaSoft.MvvmLight.CommandWpf. Если ты работаешь с WPF, то нужно использовать класс Command из GalaSoft.MvvmLight.CommandWpf. В противном случае могут быть проблемы с обновлением состояния IsEnabled.
Здравствуйте, anatolym, Вы писали:
A>Здравствуйте, okon, Вы писали:
A>У них есть 2 namespace: GalaSoft.MvvmLight.Command и GalaSoft.MvvmLight.CommandWpf. Если ты работаешь с WPF, то нужно использовать класс Command из GalaSoft.MvvmLight.CommandWpf. В противном случае могут быть проблемы с обновлением состояния IsEnabled.
Да хорошая идея, но к сожалению везде CommandWpf.
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[3]: wpf отчего может RelayCommand делать кнопку IsEnabled=fa
Насчет того как отладить подсказать не могу. Но можно пройтись по списку возможных поставщиков для свойства зависимости, и проверить наличие их в программе для свойства IsEnabled.
Ну еще можно код показать (выложить проект, если небольшой), может быть что-то смогу там найти
Re[3]: wpf отчего может RelayCommand делать кнопку IsEnabled=fa
Здравствуйте, okon, Вы писали:
O>Да хорошая идея, но к сожалению везде CommandWpf.
Как вариант, попробуй подписаться на событие IsEnabledChanged и посмотреть по стеку, что его вызвало.
Re[4]: wpf отчего может RelayCommand делать кнопку IsEnabled=fa
Здравствуйте, MxMsk, Вы писали:
MM>Здравствуйте, okon, Вы писали:
O>>Да хорошая идея, но к сожалению везде CommandWpf. MM>Как вариант, попробуй подписаться на событие IsEnabledChanged и посмотреть по стеку, что его вызвало.
Да поймалось, в callstack вижу следующее, т.е. получается все так CanExecute откуда-то вызывается но видимо не в том объекте где я ожидаю. Проверил не меняется ли DataContext кнопки , контекст не изменяется остается прежним.
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[5]: wpf отчего может RelayCommand делать кнопку IsEnabled=fa
Здравствуйте, okon, Вы писали:
O>Здравствуйте, MxMsk, Вы писали:
MM>>Здравствуйте, okon, Вы писали:
O>>>Да хорошая идея, но к сожалению везде CommandWpf. MM>>Как вариант, попробуй подписаться на событие IsEnabledChanged и посмотреть по стеку, что его вызвало.
O>Да поймалось, в callstack вижу следующее, т.е. получается все так CanExecute откуда-то вызывается но видимо не в том объекте где я ожидаю. Проверил не меняется ли DataContext кнопки , контекст не изменяется остается прежним.
В общем разгадка похоже в жизненном цикле объекта, только пока не ясно как он повлиял на жизнь лябмды
Т.е. вот так получается через некоторое время Debug.WriteLine("CanExecute") лямбды не вызывается.
При этом у самой кнопки у команды событие CanExecuteChanged приходит и если вызвать так Button.Command.CanExecute(null) то возвращается false, но в указанную в констукторе MyClass лямбду не заходит ( т.е. Debug.WriteLine("CanExecute") не вызывается ).
Т.е. такое ощущение что лямбда заменяется каким-то другим выражением.
public RelayCommand MyCommand {get;}
public MyClass( IMyInterface service)
{
MyCommand = new RelayCommand(()=>DoSomething(), ()=>
{
Debug.Writeline("CanExecute");
var result = service.Check();
Debug.Writeline("CanExecute {result}");
return result;
});
}
Если же написать вот так, то все работает как ожидается.
public RelayCommand MyCommand {get;}
private IMyInterface _service;
public MyClass( IMyInterface service)
{
_service = service;
MyCommand = new RelayCommand(()=>DoSomething(), ()=>
{
Debug.Writeline("CanExecute");
var result = _service.Check();
Debug.Writeline("CanExecute {result}");
return result;
});
}
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[6]: wpf отчего может RelayCommand делать кнопку IsEnabled=fa
Здравствуйте, okon, Вы писали:
O>Если же написать вот так, то все работает как ожидается.
Было у меня что-то подобное на StackOverflow. Попробуй просто обойтись без лямбды, сделав нормальный метод в MyClass.