Использование MVVM Light с Web-сервисом от производителя - PullRequest
0 голосов
/ 26 ноября 2011

Я использую шаблон MVVM Light для создания внешнего интерфейса WPF.Этот интерфейс будет вызывать веб-сервис для получения данных с сервера приложений.Сервер приложений является проприетарным сервером приложений Vendor, который предоставляет веб-методы через .dll.

Мне нужно получить сеанс клиента с сервера, чтобы получить результаты с сервера.Проблема в том, что когда я вызываю свою модель, которая имеет соединение с сервером, я получаю следующую ошибку:

'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 с сеткой данных из набора инструментов 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 ]

1 голос
/ 27 ноября 2011

Это исключение возникает, когда ViewModel создается анализатором XAML (через раздел ресурсов), и во время создания возникает исключение.То, что вы видите здесь, является только результатом этого нижнего исключения, то есть создание ViewModel не удалось.

Чтобы узнать, что происходит, поместите точку останова в конструктор ViewModel и запустите ваше приложение в режиме отладки.Вы обнаружите, что какой-то внутренний код дает сбой.

Вообще говоря, я не рекомендовал бы подключаться к веб-службам во время создания виртуальной машины.Это замедлит запуск вашего приложения и задержит появление первого окна.Я бы предпочел, чтобы виртуальная машина создавалась, окно отображалось с сообщением «пожалуйста, подождите», а затем происходило только подключение к веб-службам, например, вызванное событием «Loaded» окна.

Ура, Лоран

0 голосов
/ 15 мая 2014

Ну, в моем конкретном случае конструктор класса, который я регистрировал, был закрытым. Я бы хотел, чтобы исключение было более конкретным, чем указано, или, по крайней мере, имело правильное внутреннее исключение. Я думаю, проблема C # / CLR.

...