我有一个ListBox,显示员工的数据,如姓名,部门照片,徽章编号等。员工可能有不同的类型,如经理,员工,志愿者。我有3个独立的数据模板 - 每种类型一个。所有这些模板显示的数据基本相同,但呈现的方式不同。
根据登录应用程序图片的用户,徽章编号等可以显示也可以不显示。所以我有布尔属性 - CanSeePhotos,CanSeeBadgeNumbers等。所以如果CanSeePhotos == false,所有数据模板都应该隐藏照片。
我的问题是,我如何在数据模板中使用这些布尔属性来切换相应项目的可见性?当我从TemplateSelector返回参数时,有没有办法将参数传递给数据模板?
谢谢!
编辑:按照Ray的想法,我最终做到了这一点:
Visibility="{Binding Source={x:Static local:Global.CanSeePhoto}, Converter={StaticResource BooleanToVisibilityConverter}}"
答案 0 :(得分:5)
实际上有一种方法可以自定义DataTemplates,因为它们是通过将它们包装在FrameworkElementFactory中而从TemplateSelector返回的,但它太复杂了,无法满足您的需求。
对于您的情况,有两种解决方案更容易:触发器和转换器。
<强>触发器强>
您可以在DataTemplate中使用触发器。例如,在TextBox或Panel中显示徽章编号x:Name,然后在CanSeeBadgeNumebers属性上创建DataTrigger。将一个setter添加到DataTrigger并将Visible属性设置为Hidden或Collapsed,并按名称引用它。
基本理念:
<DataTemplate>
...
<DockPanel x:Name="BadgeNumberPanel">
<Label ... />
<TextBox ... />
</DockPanel>
...
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding CanSeeBadgeNumbers}" Value="true">
<Setter ElementName="BadgeNumberPanel" Property="Visibility" Value="Collapsed" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
<强>转换器强>
您可以在代码中创建一个IValueConverter,将“bool”类型转换为“Visibility”类型(有许多示例可以剪切和粘贴),然后使用转换器将TextBox的可见性绑定到CanSeeBadgeNumbers。
<DockPanel Visibility="{Binding CanSeeBadgeNumbers, Converter="{x:Static local:BoolToVisibilityConverter.Instance}}">
<Label ... />
<TextBox ... />
</DockPanel>
我是怎么做的
我实际上对我自己的代码使用了不同的技术:我的数据基础包括我编写的MarkupExtension,它调用我的核心C#表达式解析器,所以我可以说类似
Visibility="{edf:Visibility CanSeeBadgeNumber || Owner.SecurityLevel.Count() > 3}"
不幸的是我的数据基础尚未发布。如果是的话,我打算让它免费开源,但距离我们还有几个月的时间。