不仅使用RelayCommand按钮

时间:2015-04-12 05:54:00

标签: xaml mvvm windows-8.1 mvvm-light

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

这是我目前的代码:

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

我想将此代码移至Model并使用RelayCommand,但ListView,Grid和其他控件没有CommandCommandParameter属性。

在这种情况下,MVVM Light会做些什么?

1 个答案:

答案 0 :(得分:1)

从链接har07发布后,这可能会对您有所帮助,因为我看到您提到CommandParameter

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

<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>

自定义转换器类

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;
}

在构造函数中初始化relay命令以及在敲击时要触发的方法。

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" />