wpf designer: инициализатор типа для сгенерированного исключения - PullRequest
1 голос
/ 16 февраля 2010

У меня проблема с привязкой данных к классу обслуживания в WPF. Мой класс обслуживания имеет статический конструктор, который считывает информацию о конфигурации и извлекает некоторую необходимую информацию. Проблема заключается в том, что во время проектирования я получаю сообщение об ошибке: инициализатор типа для Mytype выдал исключение. Я считаю, что это потому, что информация о конфигурации не присутствует в конфигурации Visual Studio. Когда я запускаю приложение, все работает нормально, но я не могу ничего спроектировать из-за этой ошибки.

Я бы предположил, что дизайн вернется к некоторому отображению по умолчанию, если не сможет добраться до моего объекта привязки данных. По-видимому, это не так и убивает всего дизайнера. Есть ли обходной путь для этой проблемы, например, отключение динамического отображения элементов управления с привязкой к данным. Это очень расстраивает и разочаровывает. Я использую Visual Studio 2008 SP1.

Вот фрагмент кода привязки данных в моей сетке.

<ObjectDataProvider ObjectType="{x:Type local:DataService}" x:Key="dataProvider" 
    MethodName="GetCollection" >
    <ObjectDataProvider.MethodParameters>
         <s:Int32>1</s:Int32>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

По сути, класс DataService не может создавать себя, если у него нет информации о конфигурации. Я пытался создать обходной путь для моего конкретного случая, когда статический конструктор создает конкретную реализацию хранилища данных. Однако я не могу сделать это напрямую, так как это создаст круговую ссылку в моем проекте. Я попытался унаследовать класс и перехватить все исключения в статическом конструкторе родительского класса. Это все еще не работает. Любые другие идеи об обходных путях или журнал ошибок, который показывает более подробную информацию о том, какое исключение было выброшено.

Я пытался разобрать все, чтобы найти наименьший общий знаменатель. Я удалил статический конструктор и в основном возвратил голые предметы первой необходимости. Я обнаружил, что все, что извлекало данные из базы данных, не отображалось. Если я возвращаю статический список, все в порядке. Я использую блок доступа к данным корпоративной библиотеки Microsoft. Опять же, приложение работает нормально при запуске. Я предполагаю, что он не может найти необходимую информацию о соединении с базой данных, но почему это может быть проблемой? Microsoft должна была предположить, что это произойдет, когда они построят VS2008. Я что-то не так делаю?

1 Ответ

2 голосов
/ 16 февраля 2010

Ты прав. Дизайнер Visual Studio не может получить доступ к строкам подключения к вашей базе данных. Обычный способ предоставления данных времени разработки - сначала проверить, находится ли приложение в режиме разработки, и, если это так, вернуть некоторые фиктивные данные без каких-либо подключений к базе данных.

Что-то вроде следующего

public class DataService
{

   public IList<string> GetCollection()
   {

      if (!DesignerProperties.GetIsInDesignMode(new DependencyObject()))
      {

         // get data from database here
      }
      else
      {
         // return fake data for the designer
         return new List<string> {"my", "test", "data"};
      }
   }
}

Важно никогда не вызывать ничего, что будет нуждаться в конфигурации, если оно будет использоваться в режиме разработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...