Windows store apps 将带有自定义参数的事件连接到PCL中的反应式ui命令
我有一个GridView,IsItemClickEnabled设置为true。在这种情况下,将触发ItemClick事件,并使用发件人和ItemClickEventArgs调用委托。我使用的是MVVM(Caliburn.Micro),我的视图模型都位于一个可移植类库(PCL)中。所有命令路由等都由反应式UI完成。正如您所期望的那样,视图的数据上下文被设置为视图模型 问题是,据我所知,ItemClickEventArgs在PCL配置中不可用。因此,我目前不知道如何在视图模型中接收该事件。Heck-即使不使用反应式ui命令 以下是我定义的网格视图:Windows store apps 将带有自定义参数的事件连接到PCL中的反应式ui命令,windows-store-apps,caliburn.micro,reactiveui,Windows Store Apps,Caliburn.micro,Reactiveui,我有一个GridView,IsItemClickEnabled设置为true。在这种情况下,将触发ItemClick事件,并使用发件人和ItemClickEventArgs调用委托。我使用的是MVVM(Caliburn.Micro),我的视图模型都位于一个可移植类库(PCL)中。所有命令路由等都由反应式UI完成。正如您所期望的那样,视图的数据上下文被设置为视图模型 问题是,据我所知,ItemClickEventArgs在PCL配置中不可用。因此,我目前不知道如何在视图模型中接收该事件。Heck-
<GridView x:Name="PaperList" Margin="0" Grid.Column="1" IsItemClickEnabled="True" ItemClick="whatgoeshere?"/>
当然,这是可行的,这个方法会被调用。但一旦我到了那里,我该如何将信息返回到视图模型中呢?就我所知,视图对视图模型一无所知
我唯一能想到的是,我需要创建一些属性,其中包含单击的PCL对象。该方法将把项目填充到该属性中,并通过一些神奇的数据绑定将其发送回视图模型。如果是这样,我不知道如何参与数据绑定过程以获得正确的结果!确认!:-)
我还不知道这是否有什么不同,但我没有使用通用应用程序!我正在使用Caliburn.Micro的混合版本来连接我的视图,并使用反应式ui和rx来运行我的所有命令。我不喜欢让任何事情变得容易 我会这样做的
ReactiveCommand ItemClicked { get; protected set; }
public MyCoolViewModel()
{
ItemClicked = new ReactiveCommand();
}
// In My View
gridView.ItemClicked += (o,e) => ViewModel.ItemClicked.Execute(e.Item);
就我所知,视图对视图模型一无所知
这不是MVVM的工作原理-视图可以了解有关ViewModel的各种信息,这就是全部想法!然而,ViewModel对任何视图都一无所知。根据Paul给出的答案,我发现有两种不同的方法有效。最后我用了第二个。在第一种方法中,我向MyViewModel添加了一个公共方法:
public void ClickOnTile(PaperTileViewModel pt)
{
code to run;
}
然后,在我看来,我添加了以下内容:
public void ForkItUp(object sender, ItemClickEventArgs args)
{
var obj = DataContext as MyViewModel;
obj.ClickOnTile(args.ClickedItem as PaperTileViewModel);
}
我的视图的XAML用于网格视图:
<GridView x:Name="PaperList" Margin="0" Grid.Column="1" IsItemClickEnabled="True" ItemClick="ForkItUp"/>
然后,在视图中,我实现了接口:
public sealed partial class MyPageView : Page, IHomePageViewCallback
{
public MyPageView()
{
this.InitializeComponent();
}
public void FinalizeVMWiring(MyViewModel myVM)
{
PaperList.ItemClick += (s, args) => myVM.NavigateToPaperTile.Execute((args.ClickedItem) as PaperTileViewModel);
}
}
其中NavigateToPaperTile是一个反应命令,类似于Paul在回答中的命令。这个有趣的回拨是必要的,因为据我所知,在Caliburn.Micro中没有简单的方法可以获得ViewModel的键入版本
为了完整起见,这里是XAML:
<GridView x:Name="PaperList" Margin="0" Grid.Column="1" IsItemClickEnabled="True"/>
一种方法是采用DataContext,将其转换为适当的类型,然后直接使用所选项作为参数调用。这很有效。。。然而,这是最好的方法吗?啊,很好。我认为两者都不是真正了解对方——这就是框架所做的。
public sealed partial class MyPageView : Page, IHomePageViewCallback
{
public MyPageView()
{
this.InitializeComponent();
}
public void FinalizeVMWiring(MyViewModel myVM)
{
PaperList.ItemClick += (s, args) => myVM.NavigateToPaperTile.Execute((args.ClickedItem) as PaperTileViewModel);
}
}
<GridView x:Name="PaperList" Margin="0" Grid.Column="1" IsItemClickEnabled="True"/>