0

当我在 Rectangle 上使用 StaticResource 转换器为其背景着色,同时在 DataTemplate 中的另一个组件上使用 MouseDown 处理程序时,我遇到了一个非常奇怪的错误情况。如果我将代码缩小一点,这就是重现错误所需要的:

在顶部我有这些资源,一个指向一个转换器,该转换器从绑定中获取布尔值并将其转换为填充背景颜色):

<Window.Resources>
 <vm:DesktopViewModel x:Key="DesktopVM" />
 <vm:BooleanToColorConverter x:Key="converter" />
</Window.Resources>

稍后在同一个 xaml 文件中,我使用它迭代了一个警报对象列表(我已经用 StackPanel 替换了网格布局并删除了一些其他组件以缩短代码示例,下面的代码片段仍然失败):

<ItemsControl ItemsSource="{Binding Alarms}">
 <ItemsControl.ItemTemplate>
   <DataTemplate>                                                        
    <StackPanel>
     <Rectangle Height="20" Stroke="Black" Width="20" RadiusX="4" RadiusY="4" Fill="{Binding Alarm, Converter={StaticResource converter}}"/>
     <Image Source="/MyNamespace;component/images/chart.png" Stretch="None" MouseDown="Image_MouseDown" Cursor="Hand"/>
    </StackPanel>
  </DataTemplate>
 </ItemsControl.ItemTemplate>
</ItemsControl>

如果我删除图像上的 MouseDown 处理程序,它运行得很好,没有开始时出现空指针错误。如果我删除 Rectangle 中的 Fill 标记,则代码与 MouseDown 处理程序一起工作得很好!!!(并且处理程序也可以正常工作)。似乎 Fill 中的 StaticResource 引用搞砸了一些东西,导致定位鼠标处理函数失败?!?

请注意,它在创建窗口时失败,而不是在运行或单击任何内容时。

编辑:如果我将转换器替换为使用带有触发器的 StaticResource 的样式以执行与转换器相同的操作,我会遇到相同的空指针问题。很明显,属性中的 StaticResource 引用是罪魁祸首,但我不知道为什么它会影响事件侦听器。

组件的顺序也无关紧要。如果我将图像放在矩形之前,则错误完全相同。

4

1 回答 1

1

我的猜测是问题出在您的转换器代码中,它没有考虑到它可以获得空值。

为什么mouseDown的效果?可能它会导致在更早的时刻呈现图像元素,并在您的 ViewModel 尚未创建的时刻请求 Fill 属性的值。

信息太少,无法确定地说明它,但是根据我的经验,不能正确处理空值的转换器可能是 WPF 开发中的主要痛苦。许多设计时不稳定性的根源在于没有正确处理空值的转换器。

于 2012-11-08T07:48:40.430 回答