UWP.Как передать команду-параметр при выполнении ItemClickCommand AdaptiveGridView? - PullRequest
1 голос
/ 09 мая 2019
<uwpkit:AdaptiveGridView ItemsSource="{x:Bind ViewModel.FavoriteContacts}"
                             IsItemClickEnabled="True"
                             SelectedItem="{x:Bind ViewModel.SelectedContact,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                             ItemClickCommand="{x:Bind ViewModel.ExecuteCommand}">

</uwpkit:AdaptiveGridView>

В этом AdaptiveGridView отображается список избранных контактов, и вместо обработки события ItemClick я решил использовать команду.Кроме того, мне нужно передать выбранный контакт в качестве параметра команды.Итак, я нашел ItemClickCommand свойство, которое может помочь мне использовать команду.Но я не нашел ни одного способа, который позволил бы мне передавать параметры команды.

Я пытался решить эту проблему, создав свойство SelectedContact и связав его со свойством SelectedItem AdaptiveGridView, но барьер, который не позволяет мне использовать этот сценарий, заключается в том, что выполнение команды запускается до SelectedContact Установщик доступа работает.И у меня есть исключение нулевой ссылки.

Так что это была моя единственная идея, как решить эту задачу.Если вы знаете, как решить эту задачу или, возможно, как изменить порядок выполнения команды и средства доступа к сеттеру SelectedItem, объясните это.

1 Ответ

0 голосов
/ 10 мая 2019

Прежде всего, не совсем понятно, что «этот AdaptiveGridView показывает список избранных контактов, и вместо обработки события ItemClick я решил использовать команду». Означает ли это, что «показать список избранных контактов» - это только itemsSource, или когда вы обрабатываете событие ItemClick, «список избранных контактов» изменится? Но про «передать выбранный контакт в качестве параметра команды» вы можете прочитать следующий код:

Сначала в XAML:

 <uwpkit:AdaptiveGridView ItemsSource="{x:Bind ViewModel.FavoriteContacts}"
                         IsItemClickEnabled="True"
                         ItemClickCommand="{x:Bind ViewModel. ExecuteCommand}">

Далее вы можете создать командный класс следующим образом:

public class RelayCommand : ICommand
{
    public Contact selectedContact;
    private readonly Action _execute;
    private readonly Func<bool> _canExecute;

    public event EventHandler CanExecuteChanged;

    public RelayCommand(Action execute)
        : this(execute, null)
    {
    }

    public RelayCommand(Action execute, Func<bool> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute();
    }

    public void Execute(object parameter)
    {
        selectedContact = parameter as Contact;
        _execute();
    }

    public void RaiseCanExecuteChanged()
    {
        var handler = CanExecuteChanged;
        if (handler != null)
        {
            handler(this, EventArgs.Empty);
        }
    }
}

Затем в вашей ViewModel вы можете Инициализировать класс команды как свойство:

public RelayCommand ExecuteCommand { get; set; }

, это свойство привязано к «ItemClickCommand» в XAML. Также вы можете инициализировать ExecuteCommand и передать событие MyItemClick в команду:

public ContactViewModel() { ExecuteCommand = new RelayCommand(MyItemClick); }

в конструкторе ViewModel.

Наконец, вы можете видеть, что в команде есть метод public void Execute (параметр объекта). Он имеет один параметр, который можно использовать для передачи информации, связанной с UIElement, от вызывающей стороны к команде. Это означает, что когда вы щелкаете по элементу, он будет запущен, и объект «Контакт» будет передан этим методом. Затем вы можете сохранить его. Поэтому, когда вы щелкаете по элементу, метод «MyItemClick» будет активирован, и вы можете используйте объект Contact, который вы сохранили в методе Execute, например:

    private void MyItemClick(){
    Contact contact = ExecuteCommand.selectedContact;
    //do something when clicked
}

Если у вас все еще есть проблема, пожалуйста, поделитесь более подробной информацией о вашем коде, например демонстрацией с возможностью воспроизведения.

...