Windows store apps 将带有自定义参数的事件连接到PCL中的反应式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,IsItemClickEnabled设置为true。在这种情况下,将触发ItemClick事件,并使用发件人和ItemClickEventArgs调用委托。我使用的是MVVM(Caliburn.Micro),我的视图模型都位于一个可移植类库(PCL)中。所有命令路由等都由反应式UI完成。正如您所期望的那样,视图的数据上下文被设置为视图模型

问题是,据我所知,ItemClickEventArgs在PCL配置中不可用。因此,我目前不知道如何在视图模型中接收该事件。Heck-即使不使用反应式ui命令

以下是我定义的网格视图:

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