【问题标题】:How do I use ViewModelViewHost in a ListView ItemTemplate with ReactiveUI and Xamarin Forms?如何在具有 ReactiveUI 和 Xamarin 表单的 ListView ItemTemplate 中使用 ViewModelViewHost?
【发布时间】:2015-05-29 09:27:15
【问题描述】:

我正在尝试将 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 中收到以下错误消息:

不知道如何检测 ReactiveUI.XamForms.ViewModelViewHost 何时激活/停用,您可能需要实现 IActivationForViewFetcher

【问题讨论】:

    标签: c# ios listview xamarin reactiveui


    【解决方案1】:

    原来我弄错了,应该在 DataTemplate 中引用我自己的类 MonkeyCellView : ViewCell, IViewFor&lt;MonkeyCellViewModel&gt; 并使用 &lt;views:MonkeyCellView ViewModel="{Binding .}"/&gt; 将它的 ViewModel 绑定到当前项目:

    <?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>
    

    【讨论】:

      猜你喜欢
      • 2021-01-28
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      相关资源
      最近更新 更多