【发布时间】:2016-03-30 07:45:53
【问题描述】:
我正在使用 XAML 开发一个通用 Windows 平台应用程序,该应用程序在 Windows 10 IoT Core 下的 Raspberry Pi 上运行。该应用程序驱动 I2C 总线上的温度传感器。传感器类是MLX90614Thermometer。传感器使用DispatcherTimer 每 100 毫秒(大约)读取一次读数并更新移动平均值。当移动平均值的值变化超过指定阈值时,传感器会引发 ValueChanged 事件并在事件 args 中提供新值。
在我的 ViewModel 类TemperatureSensorViewModel 中,我订阅了传感器的ValueChanged 事件并使用它来更新名为Ambient、Channel1 和Channel2 的绑定属性。这些属性绑定到 XAML UI 中的文本块。这是事件处理程序:
void HandleSensorValueChanged(object sender, SensorValueChangedEventArgs e)
{
switch (e.Channel)
{
case 0:
Ambient = e.Value;
break;
case 1:
Channel1 = e.Value;
break;
case 2:
Channel2 = e.Value;
break;
}
}
...这里是Ambient...的示例数据绑定...
<TextBlock x:Name="Ambient" Grid.Row="1" Text="{Binding Path=Ambient}" Style="{StaticResource FieldValueStyle}" />
我使用的是MVVM Light Toolkit,所以我的属性是这样实现的(仅显示Ambient,但除了名称之外,其他都是相同的):
public double Ambient
{
get { return ambientTemperature; }
private set { Set(nameof(Ambient), ref ambientTemperature, value); }
}
MVVM Light Toolkit 提供了Set() 方法,该方法会自动为正在设置的属性引发PropertyChanged 通知。
如果我从传感器读取单个样本以响应按钮按下,这将正常工作。但是,一旦我启用自动采样模式(基于计时器),它就会开始抛出COMExceptions。所以这一定是某种与定时器相关的线程问题。
现在,如果我理解正确,运行时应该自动将PropertyChanged 通知编组到 UI 线程;从查看堆栈跟踪来看,情况似乎确实如此。但是,我最终得到了COMException。呃。
什么?我不明白这里发生了什么。谁能看出问题出在哪里?
【问题讨论】:
-
请注意,UWP/Windows 运行时和 WPF 是两个不同的框架。您的问题与 WPF 无关
-
建议@Tim:我认为你在寻找winrt-xaml,但我认为如果你使用两个标签,你的曝光会更好:uwp + xaml
标签: xaml uwp inotifypropertychanged windows-10-iot-core mvvm-toolkit