【发布时间】:2010-09-08 07:46:16
【问题描述】:
这不是一个真正的问题,而是一个断言。发布此内容以便其他人可以避免此问题。
如果您使用 Mvvm-Light(可能还有其他 Mvvm 框架)并且您的 ViewModel 中的代码在 UI 线程以外的线程上运行,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)类中,我创建了一个计时器,它每 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);
}
}
这为我解决了问题。希望对你有帮助。
【问题讨论】:
-
要明确一点:这与 MVVM Light 没有直接关系,而是与 VS10 设计器和 Blend 在加载应用程序时运行代码这一事实有关。因为 MVVM Light 实现了可混合性(通过连接的方式),所以可能会发生这种情况。在这种情况下,可能需要将调试器附加到 Expression Blend(甚至 VS10 设计器)以查找问题的原因。
标签: silverlight visual-studio-2010 expression-blend windows-phone-7 mvvm-light