首页 > 解决方案 > Xamarin Forms with Prism - 使用 WebService 的问题

问题描述

谁能帮我?我在 Android(屏幕)上使用 Prism i VS2017 创建了简单的 Xamarin Forms 项目。我使用棱镜模板包。我想用我的 WebService 连接项目。这是所有项目屏幕的链接 我有两个项目 PrismCoursApp 和 PrismCoursApp.Droid。第一个项目包含 SecondPageViewModel.cs,我在其中尝试使用连接的 WebService (wsMES),但我无法使用 PrismCoursApp.Droid 添加命名空间。项目 PrismCourseApp.Android 的命名空间是 PrismCourseApp.Droid 并且 PrismCourseApp.Android 依赖于 PrismCourseApp。
我只能在 PrismCourseApp.Android 项目中添加对 Web 服务的引用,但我想在 PrismCourseApp 的 SecondPageViewModel.cs 中使用它。

有人可以告诉我我做错了什么吗?谢谢

SecondPageViewModel.cs
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Linq;

using PrismCourseApp.Models;
using System.Collections.ObjectModel;

namespace PrismCourseApp.ViewModels
{
    public class SecondPageViewModel : BindableBase, INavigationAware
    {
        //zmienna do WebService 
        //wsMES.WSwitoMES ws = new wsMES.WSwitoMES();

        private string _title;
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private string _UserCode;
        public string UserCode
        {
            get { return _UserCode; }
            set { SetProperty(ref _UserCode, value); }
        }

        private string _LokalizCode;
        public string LokalizCode
        {
            get { return _LokalizCode; }
            set { SetProperty(ref _LokalizCode, value); }
        }

        public SecondPageViewModel()
        {
            UserCode = AppStateTest.User;
            LokalizCode = AppStateTest.CurrentCode;

            Title = "Użytkownik/Lokalizacja";


        }


        public void OnNavigatedFrom(INavigationParameters parameters)
        {

        }

        public void OnNavigatedTo(INavigationParameters parameters)
        {
            if (parameters.ContainsKey("par1"))
            {
                string par1 = (string)parameters["par1"];
                string par2 = (string)parameters["par2"];
            }

        }

        public void OnNavigatingTo(INavigationParameters parameters)
        {

        }
    }
}

SecondPage.axml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="PrismCourseApp.Views.SecondPage"
             BackgroundColor="White"
             Title="{Binding Title}"
             xmlns:b="clr-namespace:Prism.Behaviors;assembly=Prism.Forms"  
             xmlns:c="clr-namespace:PrismCourseApp.Converters;assembly=PrismCourseApp">
    <ContentPage.Resources>
        <ResourceDictionary>
            <!--<c:ItemTappedEventArgsConverter x:Key="itemTappedEventArgsConverter" />-->
        </ResourceDictionary>
    </ContentPage.Resources>

    <StackLayout
        Spacing="20">

        <Label
            Text="Zalogowany użytkownik:"
            TextColor="Gray"/>
        <Label 
            Text="{Binding UserCode}"
            FontSize="Large" 
            HorizontalOptions="Center" 
            VerticalOptions="CenterAndExpand" />

        <Label
            Text="Lokalizacja:"
            TextColor="Gray"/>
        <Label 
            Text="{Binding LokalizCode}"
            FontSize="Large" 
            HorizontalOptions="Center" 
            VerticalOptions="CenterAndExpand" />

        <ListView 
            x:Name="lstView">
            <!--ItemsSource="{Binding MyDatas}">-->
            <!--<ListView.Behaviors>
                <b:EventToCommandBehavior EventName="ItemTapped" 
                                          Command="{Binding ItemTappedCommand}"
                                          EventArgsConverter="{StaticResource itemTappedEventArgsConverter}" />
            </ListView.Behaviors>-->
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextCell Text="{Binding name}" Detail="{Binding comment}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>


    </StackLayout>
</ContentPage>

SecondPage.axml.cs
using Xamarin.Forms;
using PrismCourseApp.Models;
using System.Collections.ObjectModel;

namespace PrismCourseApp.Views
{
    public partial class SecondPage : ContentPage
    {    

        //Elementy do ListView (klasa MyDate w PrismCourseApp)
        private ObservableCollection<MyDate> MyDatas { get; set; }

        public SecondPage()
        {
            InitializeComponent();
            MyDatas = new ObservableCollection<MyDate>();
            lstView.ItemsSource = MyDatas;

            for (int i = 0; i < 30; i++)
            {
                MyDatas.Add(new MyDate
                {
                    name = "Pozycja " + (i+1).ToString(),
                    comment = "Miejsce na szczegóły " + (i+1).ToString()
                });
            }
        }    
    }
}

MainActivity.cs in Android Project
using Android.App;
using Android.Content.PM;
using Android.OS;
using Prism;
using Prism.Ioc;

namespace PrismCourseApp.Droid
{
    [Activity(Label = "PrismCourseApp", Icon = "@drawable/ic_launcher", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App(new AndroidInitializer()));
        }
    }

    public class AndroidInitializer : IPlatformInitializer
    {
        public void RegisterTypes(IContainerRegistry container)
        {
            // Register any platform specific implementations

        }
    }
}

标签: formsxamarinprismwebservice-client

解决方案


总结以上评论中的讨论:

不应使 Web 服务依赖于许多客户端平台之一的特定内容。最好将服务的接口放在服务器和在不同客户端实现之间共享的客户端部分之间。

假设您有一个适用于 Android 和 IOS 的移动应用程序。然后,您将拥有两个项目MyApp.Droid,并MyApp.IOS针对各自的客户特定实施。此外,还有一个他们都引用的项目,并且(希望)包含您应用程序的大部分客户端逻辑:MyApp.Logic.

现在对于服务器:您拥有MyApp.Server实现该服务的项目。如果您需要定义在应用程序和服务之间进行通信的接口(想到 WCF),您可以定义一个由客户端逻辑 ( MyApp.Logic) 和服务器实现 ( MyApp.Server) 引用的项目:MyApp.Interface

MyApp.Droid& MyApp.IOS-ref-> MyApp.Logic-ref-> MyApp.Interface<-ref-MyApp.Server


推荐阅读