UWP。 AdaptiveGridView的ItemClickCommand执行时如何传递command-parameter?

UWP. How to pass command-parameter when ItemClickCommand of AdaptiveGridView executes?

<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 并将其绑定到 AdaptiveGridViewSelectedItem 属性 来解决这个问题,但是不允许的障碍我使用这个场景是命令的执行在 SelectedContact setter 访问器运行之前运行。而且我抛出了空引用异常。

所以这是我唯一的想法如何解决这个任务。如果您知道如何解决此任务,或者可能如何更改命令的执行顺序和 SelectedItem 的 setter 访问器,请解释一下。

首先,对“这个AdaptiveGridView显示最喜欢的联系人列表而不是处理事件ItemClick我选择使用命令”不是很清楚。是说“显示收藏联系人列表”只是itemsSource 还是当你处理ItemClick 事件时,“收藏联系人列表”会改变? 但是关于“pass selected contact as command parameter”,你可以看下面的代码:

首先,在XAML:

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

接下来,您可以像这样创建命令 class:

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 中,您可以将命令 class 初始化为 属性:

public RelayCommand ExecuteCommand { get; set; }

,这个属性绑定到XAML.Also中的“ItemClickCommand”,你可以初始化ExecuteCommand并将MyItemClick事件传递给命令:

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

在您的 ViewModel 的构造函数中。

最后,你可以看到命令有一个“public void Execute(object parameter)”方法。它有一个参数,可用于将与 UIElement 绑定的信息从调用者传递给命令。这意味着当您单击该项目时,它将被触发并且“联系人”object 将通过此 method.Then 您可以保存 it.So,当您单击该项目时,“MyItemClick ”方法将被触发,您可以使用您在Execute方法中保存的联系人object,例如:

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

如果问题仍然存在,请分享有关代码的更多详细信息,例如 reproduce-able 演示。