其實有一種方法來定製的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}"
不幸的是我的數據基礎尚未發佈。如果是這樣,我打算讓它免費並且開源,但那還有幾個月了。
如果您的CanSeeBadgeNumber不是數據的屬性,而是環境的屬性,那麼您可能需要添加類似Source =「{x:Static UserInfo.CurrentUser}」的內容到綁定中。無論您使用觸發器還是轉換器,這都是一樣的。 – 2009-11-06 03:53:27
XAML綁定中的表達式!我一直在等待很長一段時間 - 我的Flex時代真的很想念它。期待看到它! – Grokys 2009-11-06 09:57:40
那麼,你有沒有發佈它? – BrainSlugs83 2014-07-03 04:40:36