我有一个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的转换器。
这很麻烦,因为当列表非常大时,绑定会被设置,转换器会在不应该执行时执行。此列表仅在用户选择查看时才可见。我知道绑定引擎会忽略折叠父级下的元素。这条规则有例外吗?或者我只是错过了什么?
答案 0 :(得分:0)
我发现了我的问题。上面的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}}"/>