我正在尝试将ReactiveUI与Xamarin Forms一起使用,并且遇到一些困难,使View Model Location在具有ItemTemplate的ListView中工作。
我已在AppBootstrapper.cs中注册了View和ViewModel,其中包含以下行:
Locator.CurrentMutable.Register(() =>
new MonkeyCellView(), typeof(IViewFor<MonkeyCellViewModel>));
我还在XAML中引用了ReactiveUI.XamForms
命名空间,并将ViewModelViewHost
包装在Page
元素中:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XamarinFormsReactiveListView.Views.MonkeyListView"
xmlns:rui="clr-namespace:ReactiveUI.XamForms;assembly=ReactiveUI.XamForms">
<StackLayout>
<Button x:Name="AddMonkey" Text="Add Monkey"/>
<ListView ItemsSource="{Binding Monkeys}" x:Name="MonkeyList">
<ListView.ItemTemplate>
<DataTemplate>
<Page>
<rui:ViewModelViewHost x:Name="vmvh" ViewModel="{Binding .}" />
</Page>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
注意:您必须将ViewModelViewHost包装在Page元素中,因为这是ReactiveUI支持的唯一元素,目前使用Xamarin Forms for ViewModelViewHost,根据此文件:
当我运行 XamarinFormsReactiveListView.iOS 项目时,我在System.Reflection.TargetInvocationException的InnerException中收到以下错误消息:
不知道如何检测ReactiveUI.XamForms.ViewModelViewHost何时被激活/停用,您可能需要实现IActivationForViewFetcher
答案 0 :(得分:1)
原来我觉得它有点不对,而应该在DataTemplate中引用我自己的类MonkeyCellView : ViewCell, IViewFor<MonkeyCellViewModel>
并将它的ViewModel绑定到<views:MonkeyCellView ViewModel="{Binding .}"/>
的当前项:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="XamarinFormsReactiveListView.Views.MonkeyListView"
xmlns:views="clr-namespace:XamarinFormsReactiveListView.Views;assembly=XamarinFormsReactiveListView">
<StackLayout>
<Button x:Name="AddMonkey" Text="Add Monkey"/>
<ListView ItemsSource="{Binding Monkeys}" x:Name="MonkeyList">
<ListView.ItemTemplate>
<DataTemplate>
<views:MonkeyCellView ViewModel="{Binding .}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>