我正在使用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);
}
{
}
}
}
}
我希望看看服务代理是否是更好的方法。如果有人有想法我会很感激。
答案 0 :(得分:1)
当XAML解析器(通过“资源”部分)创建ViewModel时会发生此异常,并且在创建期间会发生异常。你在这里看到的只是较低异常的结果,即ViewModel创建失败。
要了解发生了什么,请在ViewModel构造函数中放置一个断点,然后在调试模式下运行您的应用程序。你会发现一些内部代码崩溃了。
一般来说,我不建议在构建VM期间连接到Web服务。这将减慢应用程序的启动速度,并延迟第一个窗口的外观。我更愿意创建VM,窗口显示“请等待”消息,然后只发生与Web服务的连接,例如由Window的“已加载”事件触发。
干杯, 劳伦
答案 1 :(得分:0)
嗯,在我的特定情况下,我正在注册的类的构造函数是私有的。我希望异常更具体而不是陈述或至少有正确的内部异常。我想是C#/ CLR问题。