【问题标题】:ItemsControl items bindings called when collapsed折叠时调用的 ItemsControl 项绑定
【发布时间】: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 样式以支持虚拟化。它有帮助,但我仍在尝试理解为什么在父元素折叠时调用绑定。

标签: wpf xaml binding


【解决方案1】:

我发现了我的问题。上面的 ItemsControl 和 DataTemplate 在 UserControl 中。可见性最初是在用户控件内部通过将主布局网格绑定到可见性属性来处理的。通过简单地在父 XAML 中设置用户控件的可见性,所有绑定都开始按预期运行。

这解决了我的问题,但我仍然不明白设置主布局网格的可见性与用户控件本身的可见性之间的区别。

<c:ApplicationMenuView Grid.Column="1" Grid.Row="4"
                       HorizontalAlignment="Left" Margin="1"
                       VerticalAlignment="Stretch"
                       DataContext="{Binding Menu}"
                       Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多