Дизайнер XAML разбивает визуальную студию 2010, если модель представления, заданная как Контекст данных, регистрируется в статическом классе.
Посмотреть
<Window x:Class="CTL.Editor.View.EditorWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:editor="clr-namespace:CTL.Editor.ViewModel.Editor"
Height="300" Width="300">
<Window.DataContext>
<editor:EditorWindowViewModel />
</Window.DataContext>
<Grid>
</Grid>
</Window>
ViewModel:
public EditorWindowViewModel()
{
ApplicationViewModel.EditorWindows.Add(this);
}
~EditorWindowViewModel()
{
ApplicationViewModel.EditorWindows.Remove(this);
}
Есть ли способ обойти это? Может быть, директива #?
Для тех, кто ищет немного более подробно, чем Postlagerkarte, ответьте:
Ниже показан способ использования IsInDesignMode, который является MVVM-friendly.
if (DesignerProperties.GetIsInDesignMode(new DependencyObject()))
{
....
}
Моя проблема была вызвана тем фактом, что ApplicationViewModel конструктор, который загружает файл конфигурации и, по-видимому, Visual Studio, не понравился, не нашел файл или не искал файл в нужном месте, когда он запускал мой код.
То, что я закончил, было:
public static bool DesignMode
{
get { return DesignerProperties.GetIsInDesignMode(new DependencyObject()); }
}
static ApplicationViewModel()
{
if (!DesignMode)
{
Configuration = Configuration.LoadConfigurationDocument();
}
}
Примечание. В ApplicationViewModel есть статический элемент конфигурации и класс конфигурации, который загружает конфигурацию.
Вы можете использовать конструктор DesignerProperties.IsInDesignMode для подавления выполнения в режиме разработки. Просто заверните свой код в оператор if: if(!DesignerProperties.IsInDesignTool)
Однако часто бывает хорошей идеей найти основную причину проблемы путем отладки исключения конструктора. Вот хорошая статья, которая должна вас начать.