2010-02-16 4 views
1

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

Я бы предположил, что дизайн вернется к некоторому дисплею по умолчанию, если он не сможет попасть в мой объект привязки данных. По-видимому, это не так и убивает всего дизайнера. Существует ли какое-либо обходное решение для этой проблемы, например, отключение динамического отображения элементов управления данными. Это неудобно и разочаровывает. Я использую 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. Я делаю что-то неправильно?

ответ

2

Вы правы. Дизайнеру 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"}; 
     } 
    } 
} 

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

+0

Мое беспокойство в этом подходе заключается в том, что для моей службы передачи данных потребуется ссылка на пользовательский интерфейс в некоторой форме или форме. В этом случае мне нужна ссылка на System.ComoonentModel, которая в порядке. Но мне также нужен один в System.Windows, который кажется действительно странным и неправильным. В любом случае это поведение было изменено в vs2010. Временно я выбрал просто привязку данных в событии загрузки, установив datacontext и связавшись с дизайнером, показывая мне что-то пустое. Кажется глупым, но я предпочел бы, чтобы создать эту неприятную условную логику, чтобы удовлетворить конструктора VS ' –