使用MVVM Light和供应商提供的Web服务

时间:2011-11-26 17:06:48

标签: wpf web-services mvvm-light

我正在使用MVVM Light模式来创建WPF前端。此前端将调用Web服务以从应用程序服务器检索数据。应用程序服务器是专有的供应商应用程序服务器,它通过.dll公开Web方法。

我需要从服务器获取客户端会话才能从服务器获取结果。问题是,当我调用与服务器连接的模型时,出现以下错误:

'The invocation of the constructor on type [APP].ViewModel.ViewModelLocator' that matches the specified binding constraints threw an exception.' Line number '12' and line position '10'.

当我拿出这条线

cashaccount.getConnection(); 

系统继续并使用WPF Toolkit中的数据网格生成WPF窗口。

MainWindow.xaml

<Window x:Class="CreditSuisse.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
        mc:Ignorable="d"
        Height="301"
        Width="520"
        Title="MVVM Light Application"
        DataContext="{Binding Main, Source={StaticResource Locator}}">

    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/MainSkin.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>


    <dg:DataGrid ItemsSource="{Binding Path=CashAccount}" 
              Margin="5" AutoGenerateColumns="False">
        <dg:DataGrid.Columns>
            <dg:DataGridTextColumn Binding="{Binding AcctCd}" Header="Account Code" />
            <dg:DataGridTextColumn Binding="{Binding AcctCd}" Header="Security Name" />
            <dg:DataGridTextColumn Binding="{Binding QtySod}" Header="Quantity Start of Day" />
            <dg:DataGridTextColumn Binding="{Binding QtySod}" Header="Cash Delta (Price Delta)" />
            <dg:DataGridTextColumn Binding="{Binding QtySod}" Header="Action" />
        </dg:DataGrid.Columns>
    </dg:DataGrid>




</Window>

ViewModel.cs

    public MainViewModel()
    {
        if (IsInDesignMode)
        {
            // Code runs in Blend --> create design time data.
        }
        else
        {
            logger.Info("-----  Start   -----");
            cashaccount.getConnection();
         }
    }

我为了简洁而缩写。

这是模型

CashAccount.cs

    public class CashAccount : xx.xx.Position
    {
       private bool cashChanged=false;
       private string secName = null;
       private xxx.Wsi.ClientSession privateSession;
       private static Logger logger = LogManager.GetCurrentClassLogger();
       public bool didCashChange
       {
         get
        {
            return cashChanged;
        }
        set
        {
            this.cashChanged = value;
        }
    }

    public void getConnection()
    {
        try
        {
            app.Helper.Session session = new Session();

            privateSession = session.getSession();
                       }
        catch (TransportException e)
        {
            Console.WriteLine("Error communicating with server: " + e.Message);
            logger.Info("Couldn't log into xxx...");
            logger.Error(e.Message);
        }        
        {
        }
    }
    }
}

我希望看看服务代理是否是更好的方法。如果有人有想法我会很感激。

2 个答案:

答案 0 :(得分:1)

当XAML解析器(通过“资源”部分)创建ViewModel时会发生此异常,并且在创建期间会发生异常。你在这里看到的只是较低异常的结果,即ViewModel创建失败。

要了解发生了什么,请在ViewModel构造函数中放置一个断点,然后在调试模式下运行您的应用程序。你会发现一些内部代码崩溃了。

一般来说,我不建议在构建VM期间连接到Web服务。这将减慢应用程序的启动速度,并延迟第一个窗口的外观。我更愿意创建VM,窗口显示“请等待”消息,然后只发生与Web服务的连接,例如由Window的“已加载”事件触发。

干杯, 劳伦

答案 1 :(得分:0)

嗯,在我的特定情况下,我正在注册的类的构造函数是私有的。我希望异常更具体而不是陈述或至少有正确的内部异常。我想是C#/ CLR问题。