我有一个 ListBox 显示有关员工的数据,例如姓名、部门照片、徽章编号等。员工可能有不同的类型,例如经理、员工、志愿者。我有 3 个单独的数据模板 - 每种类型一个。所有这些模板都显示基本相同的数据,但呈现方式不同。
根据登录到应用程序图片的用户,徽章编号等可以或不可见。所以我有 bool 属性——CanSeePhotos、CanSeeBadgeNumbers 等。所以如果 CanSeePhotos == false,所有数据模板都应该隐藏照片。
我的问题是,如何在数据模板中使用这些 bool 属性来切换相应项目的可见性?当我从 TemplateSelector 返回参数时,有没有办法将参数传递给数据模板?
谢谢!
编辑:按照雷的想法,我最终这样做了:
Visibility="{Binding Source={x:Static local:Global.CanSeePhoto}, Converter={StaticResource BooleanToVisibilityConverter}}"
最佳答案
实际上,有一种方法可以自定义从 TemplateSelector 返回的 DataTemplate,方法是将它们包装在 FrameworkElementFactory 中,但它对于您的需求来说太复杂了。
对于您的情况,有两种更简单的解决方案:触发器和转换器。
触发器
您可以在 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>
转换器
您可以在将“bool”类型转换为“Visibility”类型的代码中创建一个 IValueConverter(您可以剪切和粘贴许多示例),然后使用转换器将 TextBox 的可见性绑定(bind)到 CanSeeBadgeNumbers。
<DockPanel Visibility="{Binding CanSeeBadgeNumbers, Converter="{x:Static local:BoolToVisibilityConverter.Instance}}">
<Label ... />
<TextBox ... />
</DockPanel>
我是怎么做到的
实际上,我对自己的代码使用了不同的技术:我的数据基础包括我编写的一个 MarkupExtension,它调用我的核心 C# 表达式解析器,所以我可以说类似
Visibility="{edf:Visibility CanSeeBadgeNumber || Owner.SecurityLevel.Count() > 3}"
不幸的是,我的数据基础尚未发布。如果是这样,我计划让它免费和开源,但那还需要几个月的时间。
关于WPF - DataTemplates 的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1684923/