WPF - DataTemplates 的参数?

标签 wpf datatemplate

我有一个 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/

相关文章:

wpf - 如何更改 AvalonEdit CodeCompletion 窗口上的样式?

wpf - 数据模板中的访问控制

c# - WPF - 从 DataTemplate 创建 UI 对象

c# - 在用户控件 WPF 中使用数据模板选择器时抛出空引用异常

wpf - 在 WPF DataGrid 为空时显示 "No record found"消息

c# - System.Drawing 是否应该仅在 WPF 的 UI 线程(C#)上运行?

wpf - 当 wpf 数据网格的单元格中的值使用 MVVM 更改时,如何引发事件?

.net - 无法从控制更改控制可见性

silverlight - 我可以更改 ItemTemplate 中 DataTemplate 的 VisualState 吗?

c# - 动态数据模板 silverlight 事件