将自定义args的事件连接到PCL中的reactive-ui命令

时间:2014-04-10 08:32:30

标签: windows-store-apps caliburn.micro reactiveui

我有一个GridView,IsItemClickEnabled设置为true。在这种情况下,将触发ItemClick事件,并调用具有sender和ItemClickEventArgs的委托。我正在使用MVVM(Caliburn.Micro),我的视图模型都位于便携式类库(PCL)中。所有命令路由等都由Reactive-UI完成。正如您所料,View的数据上下文被设置为视图模型。

问题是,据我所知,ItemClickEventArgs在PCL配置中不可用。所以我目前不知道如何在我的视图模型中沉没该事件。哎呀 - 即使没有使用被动的ui命令。

这是我定义的网格视图:

        <GridView x:Name="PaperList" Margin="0" Grid.Column="1" IsItemClickEnabled="True" ItemClick="whatgoeshere?"/>

我最简单的想法是取代“什么在哪里?”使用视图的代码隐藏中的方法,例如:

    public void ForkItUp(object sender, ItemClickEventArgs args)
    {
        // How do I get this information back to the view model?
    }

当然,这有效,该方法被调用。但是一旦我在那里,我怎么能把信息带回我的View模型?据我所知,视图对视图模型一无所知。

我唯一能想到的是我需要创建一些包含被点击的PCL对象的属性。这个方法会将项目填充到该属性中,并通过一些魔法数据绑定将其发送回视图模型。如果是这样,我不知道如何参与数据绑定过程来实现这一目标!确认! : - )

我不知道这是否有所作为,但我没有使用通用应用程序!我正在使用一个令人讨厌的Caliburn.Micro混合来连接我的视图,并使用Reactive-ui和rx来运行我的所有命令。我不喜欢做任何事情!

2 个答案:

答案 0 :(得分:2)

这是我怎么做的

ReactiveCommand ItemClicked { get; protected set; }

public MyCoolViewModel()
{
    ItemClicked = new ReactiveCommand();
}

// In My View
gridView.ItemClicked += (o,e) => ViewModel.ItemClicked.Execute(e.Item);
  

据我所知,视图对视图模型一无所知。

这不是MVVM的工作原理 - View可以知道关于ViewModel的所有,这就是整个想法!但是,ViewModel可以知道任何视图的

答案 1 :(得分:0)

根据保罗给出的答案,我找到了两种不同的方法。我最终使用了第二个。在第一种方法中,我向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"/>

我是一名训练有素的C ++人,因此缺乏类型安全性给我带来了一点,导致了第二种解决方案(这是我最终提交的解决方案)。所以最后我最终做了以下事情。我首先在ViewModel的PCL中创建了一个界面:

public interface IHomePageViewCallback
{
    void FinalizeVMWiring(HomePageViewModel homePageViewModel);
}

然后,在View中我实现了界面:

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在答案中的ReactiveCommand。这个有趣的回调是必要的,因为据我所知,没有简单的方法可以在Caliburn.Micro中获得ViewModel的打字版本。

为了完整性,这里是XAML:

        <GridView x:Name="PaperList" Margin="0" Grid.Column="1" IsItemClickEnabled="True"/>