1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
1 | ||||||
RelayCommand в Xamarin12.07.2021, 15:00. Показов 11107. Ответов 45
Метки нет (Все метки)
Помнится был у меня код для WPF, взятый у Элд Хасп, реализующий RelayCommand-класс:
Я уж и с бубном танцевал, и хороводы водил, и на кофейной гуще гадал -- ни так ни сяк не работает.
0
|
12.07.2021, 15:00 | |
Ответы с готовыми решениями:
45
Отличие Xamarin.Forms Xamarin.Native RelayCommand RelayCommand RelayCommand.cs не найден |
Модератор
|
|
12.07.2021, 16:44 | 2 |
В стандарте нужно явно подымать CanExecuteChanged при изменении зависимостей.
Добавлено через 52 секунды Я ещё точно не знаю как в стандарте с параметром команды. Проверьте сами если изменяется параметр, то обновляется CanExecute или нет? Добавлено через 6 минут Для стандарта нужна такая реализация RelayCommand и RelayCommand<T> общего применения - реализация команд для применения вне слоя WPF.
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||
12.07.2021, 16:47 [ТС] | 3 | |||||||||||||||
Элд Хасп, пока что взял, опять же, у Вас -- UWP ICommand реализация, добавил 2 класса, опять же, ВАШИ, из другого источника
Но ещё не тестировал. Мне кажется реализация не из лучших, но я лучше не смогу, чем Вы. В данный момент, пока что так:
0
|
Модератор
|
|
12.07.2021, 16:53 | 4 |
Да.
Оба варианта подойдут, но они не до конца "допилены" под UI. Обязательно событие нужно подымать в UI потоке, а то будет исключение. Добавлено через 2 минуты Это базовая реализация команды. Я не знаю как в стандарте диспетчер UI потока получить. Если знаете - напишите. Тогда можно будет добавить валидацию потока.
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
12.07.2021, 16:54 [ТС] | 5 |
Могу ошибаться, но в ТС, по-моему, и так реализован этот вариант. Но как уже описывалось в первом посте, использовать CommandManager не получается.
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
12.07.2021, 17:01 [ТС] | 7 | |||||
Я уже интересовался этой темой и нашёл следующую информацию:
0
|
Модератор
|
||||||
12.07.2021, 18:02 | 8 | |||||
Сообщение было отмечено limeniye как решение
Решение
Это получение контекста синхронизации текущего потока.
А основной UI поток в Xamarin есть? Добавлено через 4 минуты Это получение контекста синхронизации текущего потока. а основной UI поток в Xamarin есть? По-моему, вот это нужно: Device.BeginInvokeOnMainThread(Action) Добавлено через 16 минут С использованием реализации по вышеуказанной ссылке, будет так
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
12.07.2021, 18:08 [ТС] | 9 | |||||
В Xamarin -- есть
Хм, по-моему это вызов нужного метода в главном потоке (могу ошибаться), но не получение главного UI потока.
0
|
Модератор
|
|
12.07.2021, 18:23 | 10 |
Ну, так и нужно не то что получить главный поток, а выполнить валидацию команды в нём.
И то если в Xamarin нет маршалинга CanExecuteChanged в UI поток. В WPF маршалинг есть только для PropertyChanged. Добавлено через 2 минуты Но вы проверьте и базовую реализацию, вдруг в Xamarin есть маршалинг и не нужны танцы с бубном вокруг главного потока. Добавлено через 8 минут Вы сначала проверьте просто WpfMvvm.Commands.RelayCommand .Задайте привязку к команде. А в VM асинхронный таймер - раз в секунду подымающий RaiseCanExecuteChanged команды.Если исключений не будет, то значит ничего и делать не надо.
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||
15.07.2021, 14:09 [ТС] | 11 | |||||||||||||||
Элд Хасп, хм, то ли я делаю чего не так, не знаю, но попадаю в следующей метод RelayCommand'а только 1 раз -- при инициализации View-контрола.
0
|
Модератор
|
|
15.07.2021, 15:53 | 12 |
Значит нет валидации команды при изменении параметра.
Тогда нужно явно вызывать RaiseCanExecuteChanged при изменении зависимостей команды. То есть любой переменной от которой зависит состоянии. В данном случае это свойство TypeObject. По идее можно добавить поведение к Button, которое будет ревалидировать команду при изменении параметра, но мне сейчас неохота влазить в тонкости UWP. Попробуйте сами справится.
1
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||
15.07.2021, 19:30 [ТС] | 13 | ||||||||||
Добавил в класс RelayCommand следующую строку:
0
|
Модератор
|
|
15.07.2021, 22:55 | 14 |
Вы не поняли.
То что вы вставили это маршалинг RaiseCanExecuteChanged в основной UI поток. Но кроме этого нужно ещё при изменении свойства TypeObject (и других зависимостей если они есть), подымать это событие: DoSomethingCommand.RaiseCanExecuteChanged().
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||
15.07.2021, 23:16 [ТС] | 15 | |||||
Элд Хасп, не совсем понимаю.
Допустим в TypeObject у меня есть свойство Name. Я изменил его, через View-представление. Дальше я должен определить, что этот объект изменился и поднять DoSomethingCommand.RaiseCanExecuteChanged() .Если я правильно понял задачу, то в голову мне приходит это:
0
|
Модератор
|
|
16.07.2021, 07:21 | 16 |
Да.
Что-то в подобном духе. Добавлено через 3 минуты Но если TypeObject - это сложный объект, а валидация нужна по значением его свойств, то наблюдать надо не только за TypeObject, но и за его свойствами. Придётся подключаться к TypeObject.PropertyChanged и из обработчика события вызывать RaiseCanExecuteChanged.
1
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||||||||||||
16.07.2021, 11:03 [ТС] | 17 | ||||||||||||||||||||
Интерфейс моего объекта унаследовал от INotifyPropertyChanged, дабы иметь доступ к PropertyChanged, который у меня реализован.
К сожалению отхвачиваю NullExeption, но не хочу указывать какой-то определённый класс через = new SomeClassViewModel() . Да и в принципе в моей реализации весьма адекватно то, что объект может быть null. Например, когда нужно действие (например открытие формы работы с этим объектом) не было выполнено -- объект будет пустой. Как мне это обойти?
0
|
Модератор
|
||||||
16.07.2021, 11:55 | 18 | |||||
В конструкторе делается для свойств "только для чтения".
Но у вас мутабельное свойство, поэтому нужно подключать/отключать при его изменении. Вы используете не очень удобную реализацию INPC, поэтому проверку надо производить в двух места.
0
|
1181 / 623 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|||||||||||
16.07.2021, 12:52 [ТС] | 19 | ||||||||||
Какая есть более удобная альтернатива?
В данный момент использую комбинацию двух Ваших Кликните здесь для просмотра всего текста
Предложенная Вами реализация плюётся ошибками, мол нельзя привести T к моему типу. Не ругается так:
П.с.: заметил ошибку тут: там не public interface TypeVM а public class TypeVM.
0
|
Модератор
|
|
16.07.2021, 13:18 | 20 |
Если по проще, то Базовый класс для ViewModel - BaseInpc - реализация INotifyPropertyChanged и вспомогательных методов..
Тогда так ((TypeVM)(object)fieldProperty).PropertyChanged .И обратите внимание, что fieldProperty надо проверять ДО вызова base.PropertyNewValue .Так как после его вызова в fieldProperty и newValue будет одно и тоже значение. В реализации BaseInpc сделано несколько иначе. Во-первых, значения там упакованы в object, поэтому дополнительная упаковка не нужна. Во-вторых, там не ссылка на поле, а его значение. Поэтому можно обработку делать после вызова base.PropertyNewValue .
1
|
16.07.2021, 13:18 | |
16.07.2021, 13:18 | |
Помогаю со студенческими работами здесь
20
ViewModel: RelayCommand и метод Спам CanExecute в RelayCommand RelayCommand и асинхронный код RelayCommand как передать переменную Label пропадает после выполнения RelayCommand Binding параметров к CommandParameter c RelayCommand (Win8.1/WP8.1) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |