WPF - DataTemplates的参数?

时间:2009-11-06 01:55:11

标签: wpf datatemplate

我有一个ListBox,显示员工的数据,如姓名,部门照片,徽章编号等。员工可能有不同的类型,如经理,员工,志愿者。我有3个独立的数据模板 - 每种类型一个。所有这些模板显示的数据基本相同,但呈现的方式不同。

根据登录应用程序图片的用户,徽章编号等可以显示也可以不显示。所以我有布尔属性 - CanSeePhotos,CanSeeBadgeNumbers等。所以如果CanSeePhotos == false,所有数据模板都应该隐藏照片。

我的问题是,我如何在数据模板中使用这些布尔属性来切换相应项目的可见性?当我从TemplateSelector返回参数时,有没有办法将参数传递给数据模板?

谢谢!

编辑:按照Ray的想法,我最终做到了这一点:

Visibility="{Binding Source={x:Static local:Global.CanSeePhoto}, Converter={StaticResource BooleanToVisibilityConverter}}"

1 个答案:

答案 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}"

不幸的是我的数据基础尚未发布。如果是的话,我打算让它免费开源,但距离我们还有几个月的时间。