Wpf ItemsControl项绑定在折叠时调用

Wpf ItemsControl项绑定在折叠时调用,wpf,xaml,binding,Wpf,Xaml,Binding,我有一个ItemsControl,它显示消息列表。它的定义是 <ItemsControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Messages}" > </ItemsControl> 然后,我有一个DataTemplate来处理每条消息的显示。它的定义是 <DataTemplate DataType="{x:T

我有一个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时,My Items控件仍会遍历DataTemplate,并为每个MessageViewModel调用BorderBrush和BackgroundBrush的转换器


这很麻烦,因为当列表非常大时,会设置绑定并在不应该的时候执行转换器。此列表仅在用户选择查看时可见。我知道绑定引擎会忽略折叠父项下的元素。这条规则有例外吗?还是我错过了什么

我发现了我的问题。上面的ItemsControl和DataTemplate位于UserControl中。可见性最初是在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}}"/>


我尝试了您的代码,但没有调用转换器。请确保您没有更改viewmodel,尤其是消息数据,或者您没有更改数据上下文(重新设置)等等。请使用列表框,这样您将启用虚拟化。这意味着,即使您有5k个项目,也只会显示10个,并且会调用它们的转换器。frno-验证期间,消息列表会发生很大变化。如果父元素被折叠,我仍然希望绑定被忽略。dev hedgehog-我实际上扩展了ItemsControl样式以支持虚拟化。这很有帮助,但我仍在试图理解为什么在父元素折叠时调用绑定。