【问题标题】:Use RelayCommand with not only buttons不仅将 RelayCommand 与按钮一起使用
【发布时间】:2015-06-17 15:34:07
【问题描述】:

我在我的项目中使用 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 在这种情况下可以做什么?

【问题讨论】:

标签: xaml mvvm windows-8.1 mvvm-light


【解决方案1】:

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

自定义转换器类

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

【讨论】:

    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多