代码之家  ›  专栏  ›  技术社区  ›  tig

用于windowsphone7的VS2010与Mvvm-Light混合崩溃

  •  4
  • tig  · 技术社区  · 16 年前

    如果您使用Mvvm Light(可能还有其他Mvvm框架),并且ViewModel中的代码运行在UI线程以外的线程上,那么在设计模式下尝试查看/编辑XAML时,VS2010和Exression Blend可能会崩溃。

    <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派生)中,我创建了一个计时器,它每5秒更改PowerState属性(从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 回复  |  直到 16 年前
        1
  •  0
  •   Andréas Saudemont    16 年前

    你也可以用 DispatcherTimer 而不是计时器。您将失去一点准确性,但另一方面,回调将在UI线程上调用,这可能会防止崩溃(或不会)。