2009-11-06 4 views
9

이름, 부서 사진, 배지 번호 등과 같은 직원 관련 데이터를 보여주는 ListBox가 있습니다. 직원은 관리자, 직원, 자원 봉사자와 같은 유형이 다를 수 있습니다. 3 가지 데이터 템플릿이 있습니다. 하나는 각 유형에 대한 템플릿입니다. 이 모든 템플릿은 기본적으로 동일한 데이터를 표시하지만 다르게 표시됩니다.WPF - DataTemplates에 대한 매개 변수?

응용 프로그램 사진에 로그인 한 사용자에 따라 배지 번호 등이 보이거나 보이지 않을 수 있습니다. 그래서 부울 속성 - CanSeePhotos, CanSeeBadgeNumbers 등. CanSeePhotos == false이면 모든 데이터 템플릿이 사진을 숨겨야합니다.

내 질문에 내 데이터 템플릿 내에서 이러한 부울 속성을 사용하여 적절한 항목의 표시 여부를 전환 할 수 있습니까? TemplateSelector에서 매개 변수를 반환 할 때 데이터 템플릿에 매개 변수를 전달하는 방법이 있습니까?

감사합니다.

편집 : 레이의 생각 다음 나는이 일을 결국 :

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

답변

4

사실이 그들이 FrameworkElementFactory 내부를 포장하여 TemplateSelector에서 반환하지만 너무 복잡로 DataTemplates을 사용자 정의 할 수있는 방법 귀하의 필요에 따라

귀하의 경우에는 트리거와 변환기가 훨씬 간편한 두 가지 솔루션이 있습니다.

트리거는

당신은 DataTemplate을 내부 트리거를 사용할 수 있습니다. 예를 들어 배지 번호를 x : Name으로 표시하는 TextBox 또는 Panel을 지정한 다음 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를 만들 수 있습니다

및 붙여 넣기), 변환기를 사용하여 TextBox의 가시성을 CanSeeBadgeNumbers에 바인딩하십시오.

<DockPanel Visibility="{Binding CanSeeBadgeNumbers, Converter="{x:Static local:BoolToVisibilityConverter.Instance}}"> 
    <Label ... /> 
    <TextBox ... /> 
</DockPanel> 

나는 그것을 어떻게

사실은 내 자신의 코드에 대해 서로 다른 기술을 사용 : 내 데이터 기반 내 핵심 C#을 표현 파서를 호출 내가 쓴 MarkupExtension을 포함, 그래서 뭔가를 말할 수

Visibility="{edf:Visibility CanSeeBadgeNumber || Owner.SecurityLevel.Count() > 3}" 

불행히도 내 데이터 기반은 아직 발표되지 않았습니다. 그것이있을 때, 나는 그것을 자유롭고 오픈 소스로 만들 계획을 가지고있다. 그러나 그것은 아직 몇 달 전의 일이다.

+1

CanSeeBadgeNumber가 데이터의 속성이 아니라 환경의 속성 인 경우 바인딩에 Source = "{x : Static UserInfo.CurrentUser}"와 같은 것을 추가해야 할 수 있습니다. 이것은 트리거 또는 변환기를 사용하던간에 동일합니다. –

+1

XAML 바인딩의 표현식! 나는 오랫동안 그것을 기다리고 있었다 - 나의 Flex 일에서 정말로 그것을 놓친다. 그것을보고 고대! – Grokys

+4

그럼 석방 해 봤어? – BrainSlugs83

관련 문제