将 RelayCommand 与按钮一起使用

Use RelayCommand with not only buttons

我在我的项目中使用 MVVM Light,我想知道是否有任何方法可以对所有控件(例如 ListView 或 Grid)使用 RelayCommand。

这是我当前的代码:

private void Item_Tapped(object sender, TappedRoutedEventArgs e)
{
    var currentItem = (TechItem)GridControl.SelectedItem;
    if(currentItem != null)
        Frame.Navigate(typeof(TechItem), currentItem);
}

我想将此代码移动到模型并使用 RelayCommand,但 ListView、Grid 和其他控件没有 CommandCommandParameter 属性。

在这种情况下,MVVM Light 提供什么功能?

继 link har07 发布后,我看到你提到 CommandParameter

这可能对你有用

可以使用自定义转换器将列表中的 "Tapped" 项作为参数发送到中继命令。

<ListView
    x:Name="MyListView"
    ItemsSource="{Binding MyCollection}"
    ItemTemplate="{StaticResource MyTemplate}"
    IsItemClickEnabled="True">

    <i:Interaction.Behaviors>
        <core:EventTriggerBehavior EventName="ItemClick">
             <core:InvokeCommandAction Command="{Binding ViewInMoreDetail}" InputConverter="{StaticResource TapConverter}" />
        </core:EventTriggerBehavior>
    </i:Interaction.Behaviors>

</ListView>

自定义转换器class

public class TapConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var args = value as ItemClickEventArgs;

        if (args != null)
            return args.ClickedItem;

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

在您的视图模型中,您有一个 relaycommand

public RelayCommand<MyObject> MyRelayCommand
{
    get;
    private set;
}

在你的构造函数中初始化中继命令和你想要在点击发生时触发的方法。

MyRelayCommand = new RelayCommand<MyObject>(HandleTap);

此方法接收在列表视图中被点击的对象作为参数。

private void HandleTap(MyObject obj)
{
    // obj is the object that was tapped in the listview.   
}

不要忘记将 TapConverter 添加到您的 App.xaml

<MyConverters:TapConverter x:Key="TapConverter" />