我有一个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来运行我的所有命令。我不喜欢做任何事情!
答案 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"/>