c# - 如何在带有 ReactiveUI 和 Xamarin Forms 的 ListView ItemTemplate 中使用 ViewModelViewHost?

标签 c# ios listview xamarin reactiveui

我正在尝试将 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 支持的唯一元素:

https://github.com/reactiveui/ReactiveUI/blob/master/ReactiveUI.XamForms/XamForms/ActivationForViewFetcher.cs

当我运行 XamarinFormsReactiveListView.iOS 项目时,我在 System.Reflection.TargetInvocationException 的 InnerException 中收到以下错误消息:

Don't know how to detect when ReactiveUI.XamForms.ViewModelViewHost is activated/deactivated, you may need to implement IActivationForViewFetcher

最佳答案

原来我有点不对,应该引用我自己的类 MonkeyCellView : ViewCell, IViewFor<MonkeyCellViewModel>在 DataTemplate 中并将其 ViewModel 绑定(bind)到当前项目 <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>

关于c# - 如何在带有 ReactiveUI 和 Xamarin Forms 的 ListView ItemTemplate 中使用 ViewModelViewHost?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30315323/

相关文章:

android - CustomListView后台问题

list - 从列表中获取itemCount

c# - 为什么 .NET 中的 $ 多行正则表达式不匹配 CRLF?

c# - 使用 LINQ 将 SQL 表转为 CSV

iOS UIWebview 不加载新的 css

ios - 跳过 CKQueryCursor cloudkit 的数量

c# - 从 C# 中的文本文件中间删除多余的 Carriage

c# - 从非常大的 HTML 文件中解析特定元素

ios - 今天扩展(应用程序组)

javascript - 如何在 QML 中动态添加项目到 VisualItemModel?