Nano Hash - криптовалюты, майнинг, программирование

Как передать параметр в команду

У меня есть решение Xamarin Forms, и на одной странице есть список с изображениями. Когда изображение нажато, я хотел бы запустить процедуру, в которой в качестве параметра указан путь к изображению. В xaml я определяю изображение с помощью:

<Image Source="{Binding ImagePath}"
        WidthRequest="30" HeightRequest="30"
        HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" >
  <Image.GestureRecognizers>
    <TapGestureRecognizer Command="{Binding TapImageCommand}" CommandParameter="{Binding ImagePath}" />
  </Image.GestureRecognizers>
</Image>

и TapImageCommand определяется в конструкторе модели представления как:

TapImageCommand = new Command<string>(ImagePath =>
{
    OnImageTapped(ImagePath);
});

и TapImageCommand определяется с помощью:

public ICommand TapImageCommand { get; set; }

Проблема в том, что OnImageTapped никогда не запускается. Что я делаю не так?

03.04.2017

  • Если вы установите точку останова OnImageTapped(ImagePath); это останавливается? 03.04.2017
  • Нет, не останавливается. 03.04.2017

Ответы:


1

Проблема здесь в том, что вы думаете, что связываете ImagePath объекта позади списка, но это не так. Посмотрите на Command, который вы привязываете, это часть PageModel, а не объект в списке, так что и CommandParameter.

Таким образом, ImagePath, вероятно, является null, и он не соответствует вашей подписи для Command, которая ожидает string.

В этом конкретном случае, вероятно, проще всего указать весь объект в качестве параметра и получить свойство самостоятельно. Я предполагаю, что объект в списке имеет тип Foo, затем отредактируйте код, как показано ниже.

На ваш взгляд, измените TapGestureRecognizer на это:

TapGestureRecognizer Command="{Binding TapImageCommand}" CommandParameter="{Binding .}" />

Точка указывает на себя, в данном случае на конкретный экземпляр Foo в вашем списке. Затем отредактируйте Command следующим образом:

TapImageCommand = new Command<Foo>(fooObject =>
{
    OnImageTapped(fooObject);
});

Теперь в вашем методе OnImageTapped вы можете извлечь свойство ImagePath.

03.04.2017
  • Я понял проблему, о которой вы говорите, и попробовал вашу реализацию, но я все еще не могу запустить команду. Возможно, проблема связана с {Binding .}. У меня есть ‹ListView ItemsSource={Binding Foos}›, и элементы определены с помощью ‹ListView.ItemTemplate›‹DataTemplate›‹ViewCell› 03.04.2017
  • решено? У меня такая же проблема, я использую плагин MR.gesture для разных жестов. В моем случае команда запущена, но иногда значение параметра команды равно нулю. 23.08.2018
  • Команда должна быть типа Command‹T› иначе работать не будет 14.10.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..