我在我的项目中使用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和其他控件没有Command
和CommandParameter
属性。
在这种情况下,MVVM Light会做些什么?
答案 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" />