【发布时间】:2015-10-26 16:47:24
【问题描述】:
i当 ComboBox 的所有项目都折叠时,是否有一种纯 XAML 方法来隐藏 ComboBox?
例如,我有一个组合框:
<ComboBox ItemsSource="{Binding Persons}">
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="Visibility" Value="{Binding IsAlive, Converter={StaticResource BoolToVis}}" />
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
预期行为:如果所有人都死了,组合框不可见,但如果至少一个人还活着,组合框是可见的(并且只显示活着的人)
我已经在代码中使用CollectionViewSource、Filter 和应用过滤器后CollectionViewSource.View 中的元素计数实现了此行为,但我更愿意在没有代码行为的情况下仅在 XAML 中实现该行为。
编辑: 我需要一个可在所有 ComboBoxes 中使用的通用解决方案,作为样式的一部分,而不是分配 Person 类型或 IsAlive 属性......所以解决方案应该只取决于包含项目的可见性属性
【问题讨论】:
-
为什么不做你已经为单个项目做的同样的事情呢? IE。将
ComboBox.Visibility属性绑定到Persons属性,并使用转换器扫描集合,如果任何项目将IsAlive设置为true,则返回Visibility.Visible,否则返回Visibility.Collapsed。由于您显然已经知道这种方法,因此如果您能在问题中解释为什么这对这个特定目标不起作用,那将会很有帮助。更好的是,提供 a good, minimal, complete code example 来显示所有这些。 -
@PeterDuniho 因为我需要一个可在所有 CheckBox 中使用的通用解决方案作为样式的一部分,而不是分配 Person 类型或 IsAlive 属性......所以解决方案应该只取决于包含项目的可见性属性
-
复选框还是组合框?
-
我不认为你可以做“纯 XAML”。在某些时候,一些代码隐藏需要将集合的状态转换为可见性。也就是说,您可以绑定到
ItemsSource集合,然后在您的转换器中使用ItemContainerGenerator.ContainerFromItem()来检索代表您的数据项的可视化容器。从中,您可以检查其可见性,而不必编写特定于模型的代码。 -
您的视图模型是否有理由必须返回所有生者和死者?相反,如果您绑定到“LivingPersons”,那么通过将 ComboBox 类的 HasItems 属性转换为 Visibility 属性,可以简化您的可见性问题。另外,您为什么使用看起来是您的手卷 BoolToVis 转换器而不是 System.Windows.Controls 中可用的 BooleanToVisibilityConverter 类?