Сбой VS2010 для Windows Phone 7 & Blend с Mvvm-Light - PullRequest
4 голосов
/ 08 сентября 2010

Это на самом деле не вопрос, а утверждение. Размещайте это так, чтобы другие могли избежать этой проблемы.

Если вы используете Mvvm-Light (и, возможно, другие фреймворки Mvvm) и у вас есть код в вашей ViewModel, который работает в потоке, отличном от потока пользовательского интерфейса, VS2010 и Exression Blend, вероятно, вылетят при попытке просмотреть / отредактировать ваш XAML в дизайне режим.

Например, у меня есть CheckBox, связанный со свойством, которое реализуется объектом, который обновляется в фоновом потоке:

<CheckBox Content="Switch 1" 
          IsChecked="{Binding Switch1.PowerState, Mode=TwoWay}"
          Height="72" HorizontalAlignment="Left" Margin="24,233,0,0" 
          Name="checkBox1" VerticalAlignment="Top" Width="428" />

В классе Switch (производном от ViewModelBase) я создаю таймер, который меняет свойство PowerState каждые 5 секунд (с true на false и обратно).

Поскольку разработчики VS2010 / Blend запускают мой код во время разработки, этот код вызывался, и таймер срабатывал. Оба приложения потерпели крах в моей функции обратного вызова таймера.

Исправить несложно:

Не забудьте обернуть любой код, который вы НЕ ХОТИТЕ ЗАПУСТИТЬ во время разработки, в условное IsInDesignMode. Вот так.

    public OnOffSwitchClass()
    {
        if (IsInDesignMode)
        {
            // Code runs in Blend --> create design time data.
        }
        else
        {
            _timer = new System.Threading.Timer(TimerCB, this, TIMER_INTERVAL, TIMER_INTERVAL);
        }
    }

Это исправило это для меня. Надеюсь, это поможет вам.

1 Ответ

0 голосов
/ 08 сентября 2010

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

...