XAML Designer дает сбой при саморегистрации ViewModel

1

Дизайнер 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);
}

Есть ли способ обойти это? Может быть, директива #?

Теги:
xaml
wpf
mvvm
designer

2 ответа

1
Лучший ответ

Для тех, кто ищет немного более подробно, чем 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 есть статический элемент конфигурации и класс конфигурации, который загружает конфигурацию.

2

Вы можете использовать конструктор DesignerProperties.IsInDesignMode для подавления выполнения в режиме разработки. Просто заверните свой код в оператор if: if(!DesignerProperties.IsInDesignTool)

Однако часто бывает хорошей идеей найти основную причину проблемы путем отладки исключения конструктора. Вот хорошая статья, которая должна вас начать.

  • 0
    Спасибо, это именно то, что я искал. Я планирую немного изучить код, прежде чем прибегать к нему, но, по крайней мере, есть какой-то вариант.
  • 0
    Кажется, проблема вызвана вызовом .Add () для List в статическом классе (список инициализируется).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню