2009-11-06 103 views
9

我有一個列表框顯示員工的數據,如姓名,部門照片,徽章號碼等。員工可能有不同的類型,如經理,員工,志願者。我有3個獨立的數據模板 - 每種類型一個。所有這些模板顯示基本相同的數據,但呈現不同。WPF - DataTemplates的參數?

根據登錄到應用程序圖片的用戶,徽章號碼等可以或不可見。所以我有布爾屬性 - CanSeePhotos,CanSeeBadgeNumbers等。因此,如果CanSeePhotos == false,所有數據模板應該隱藏照片。

我的問題是,我如何在我的數據模板中使用這些布爾屬性來切換適當項目的可見性?有沒有辦法將參數傳遞給Data Templates,因爲我從TemplateSelector中返回它們?

謝謝!

編輯:下面雷的想法,我終於實現了這一點:

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

回答

4

其實有一種方法來定製的DataTemplates,因爲它們是從TemplateSelector通過包裝他們FrameworkElementFactory內返回,但它是太複雜滿足您的需求。

對於您的情況,有兩種解決方案更容易:觸發器和轉換器。

觸發器

可以使用DataTemplate中內的觸發器。例如,給文本框或面板顯示徽章號碼的地方:x:Name,然後在CanSeeBadgeNumebers屬性上創建一個DataTrigger。將一個setter添加到DataTrigger,並將Visible屬性設置爲隱藏或摺疊,並按名稱引用它。

基本思想:

<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和粘貼),然後使用轉換器將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}" 

不幸的是我的數據基礎尚未發佈。如果是這樣,我打算讓它免費並且開源,但那還有幾個月了。

+1

如果您的CanSeeBadgeNumber不是數據的屬性,而是環境的屬性,那麼您可能需要添加類似Source =「{x:Static UserInfo.CurrentUser}」的內容到綁定中。無論您使用觸發器還是轉換器,這都是一樣的。 – 2009-11-06 03:53:27

+1

XAML綁定中的表達式!我一直在等待很長一段時間 - 我的Flex時代真的很想念它。期待看到它! – Grokys 2009-11-06 09:57:40

+4

那麼,你有沒有發佈它? – BrainSlugs83 2014-07-03 04:40:36