【发布时间】:2013-11-21 23:25:09
【问题描述】:
我有一个显示消息列表的 ItemsControl。它被定义为...
<ItemsControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
ItemsSource="{Binding Messages}" >
</ItemsControl>
然后我有一个 DataTemplate 来处理每条消息的显示。它被定义为...
<DataTemplate DataType="{x:Type vm:MessageViewModel}">
<Button Command="{Binding CommandOpenPage}">
<Button.Template>
<ControlTemplate>
<Border Margin="2" BorderThickness="1"
BorderBrush="{Binding Flags, Converter={StaticResource msgFlagConverter}}"
Background="{Binding Flags, Converter={StaticResource msgFlagConverter}, ConverterParameter=1}" >
<TextBlock Text="{Binding Path=Message}" Style="{StaticResource ActionItem}" TextWrapping="Wrap" />
</Border>
</ControlTemplate>
</Button.Template>
</Button>
</DataTemplate>
一切都显示正常。我的问题是当父控件设置为 Visibility=Collapsed 我的 ItemsControl 仍然通过 DataTemplate 并为每个 MessageViewModel 调用 BorderBrush 和 BackgroundBrush 转换器。
这很麻烦,因为当列表非常大时,会设置绑定,并且在不应该执行转换器时执行转换器。此列表仅在用户选择查看时可见。我了解绑定引擎会忽略折叠父项下的元素。这条规则有例外吗?还是我只是错过了什么?
【问题讨论】:
-
我已经尝试过您的代码,但没有调用转换器。确保您没有更改视图模型,特别是消息数据,或者您没有更改数据上下文(重新设置)等
-
改为使用 ListBox,您将启用虚拟化。意味着即使您有 5k 个项目,也只会显示 10 个,并且会调用它们的转换器。
-
frno - 消息列表在验证过程中确实发生了很大变化。如果父元素折叠,我仍然希望忽略绑定。
-
开发刺猬——我确实扩展了 ItemsControl 样式以支持虚拟化。它有帮助,但我仍在尝试理解为什么在父元素折叠时调用绑定。