2009-11-06 2 views
9

У меня есть ListBox, показывающий данные о сотрудниках, таких как имя, фотография отдела, номер значка и т. Д. Сотрудники могут иметь разные типы, такие как менеджер, персонал, волонтеры. У меня есть 3 отдельных шаблона данных - по одному для каждого типа. Все эти шаблоны показывают в основном одни и те же данные, но представлены по-разному.WPF - Параметры для DataTemplates?

В зависимости от пользователя, зарегистрированного в приложении, номер значка и т. Д., Может быть или не быть видимым. Поэтому у меня есть логические свойства для этого: CanSeePhotos, CanSeeBadgeNumbers и т. Д. Поэтому, если CanSeePhotos == false, все шаблоны данных должны скрывать фотографии.

Мой вопрос: как я могу использовать эти логические свойства внутри своих шаблонов данных для переключения видимости соответствующих элементов? Есть ли способ передать параметры шаблонам данных, когда я возвращаю их из своего TemplateSelector?

Спасибо!

редактировать: следуя идее Рэя, я в конечном итоге делает это:

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

ответ

4

На самом деле есть способ настроить DataTemplates, как они возвращаются из TemplateSelector, обернув их внутри FrameworkElementFactory, но это слишком сложный для ваших нужд.

Для вашего случая есть два решения, которые намного проще: триггеры и преобразователи.

Триггеры

Вы можете использовать триггер внутри DataTemplate. Например, дайте TextBox или Panel, где вы выведете номер значка x: Name, а затем создайте DataTrigger в свойстве CanSeeBadgeNumebers. Добавьте один установщик в 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 в коде, который преобразует тип «Его» для типа «Видимость» (есть много примеров, там вы можете вырезать и paste), затем привяжите видимость 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}" к вашей привязке. Это то же самое, если вы используете триггеры или конвертеры. –

+1

Выражения в привязках XAML! Я ждал этого в течение долгого времени - действительно скучаю по нему со дней Flex. Ждем его! – Grokys

+4

Итак, вы когда-нибудь выпускали его? – BrainSlugs83