2010-01-23 3 views
14

좋아, 여기 내 XAML은 다음과 같습니다.WPF : 문자열 내용 별 가시성 바인딩

<TextBlock Text="{Binding Path=InstanceName}"></TextBlock> 

InstanceName이 null이거나 빈 문자열이면 Visibility="Collapsed"가 필요합니다. 그렇지 않으면 나는 Visibility="Visible"을 원한다. 내가 어떻게 그럴 수 있니?

답변

40

다음 코드 숨김과

<TextBlock 
    Visibility="{Binding InstanceName, Converter={local:StringNullOrEmptyToVisibilityConverter}}" 
    Text="{Binding InstanceName}"/> 

을 :

public class StringNullOrEmptyToVisibilityConverter : System.Windows.Markup.MarkupExtension, IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return string.IsNullOrEmpty(value as string) 
      ? Visibility.Collapsed : Visibility.Visible; 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    {    
     return this; 
    } 
} 
+0

나는 그 일을 볼 수 있지만 정말 지루한 얻을 것. 나는 더 나은 길을 찾아야한다고 생각합니다. –

+6

지루한 부분은 무엇이라고 생각하십니까? 가시성과 텍스트를 별도로 설정하는 것이 지루할 수 있다고 생각하십니까? 또는 일반적으로 valueconverters라고 생각합니까? "InstanceName"을 반복하지 않도록 path = Name을 사용하여 visibility 속성을 relativesource로 바인딩하는 것이 좋습니다. 이외의 다른 방법이 없습니다.이 방법이 지루할 수 있음을 모르겠다. (항상 독자적으로 MarkupExtensions를 작성할 수도 있고,이를 수행 할 수있는 동작을 작성할 수도 있지만, 맨 위에 있고 valueconverter는 옳은 일) –

0

.

그렇지 않으면, MVVM-패턴 또는 ValueConverter 당신을 도움이 될 것입니다.

+1

나는 그것을 좋아하지 않습니다. 모델은 여러보기에서 공유해야하지만이 동작은이보기에서만 필요합니다. –

+1

이보기와 뷰 모델 간에는 일대일 관계가 있습니다. 공통된 기능을 공유하는 뷰가 있다면 공통 부분을 추출하여 공통 뷰 모델 슈퍼 클래스에 넣을 수 있습니다. –

+0

그 말이 맞지 않습니다. 나는 'ViewModels'에 익숙하지 않지만 고전 MVC를 사용하면 여러 개의 뷰를 동일한 모델 인스턴스에 바인딩 할 수 있습니다. 그렇게하면 한 창에서 편집하고 다른 창에서 실시간으로 업데이트 된 것을 볼 수 있습니다. –

3

당신이 트리거 그런에 대한을 사용할 수 있습니다 : 당신의 가시성 속성을 바인딩 할 수있는 뷰 모델에 추가 속성을 둬서

+0

+1 값 변환기가 정확합니다. –

+0

트리거와 ValueConverter 모두 테스트 할 수 없습니다. –

+2

유일한 진정한 테스트는 원하는 효과에 대한 결과를 육안으로 검사하는 것이므로 "테스트 가능"하지 않습니다. –

0
<TextBlock Text="{Binding Path=InstanceName},FallbackValue={x:Null}"></TextBlock> 

는 그 값이 널 세터를 이용하여 변경 시인성 확인하는 추가 DataTrigger. 이것은 iam이 사용하는 간단한 방법입니다.

당신은 ValueConverter 사용할 수
+0

흥미 롭습니다. 하지만이 InstanceName == String.Empty 함께 작동하지 않습니다 ... –

0

좋아, 그래서이 PyBinding에 가까운 :

<TextBlock Text="{Binding Path=InstanceName}" Visibility="{p:PyBinding BooleanToVisibility(IsNotNull($[.InstanceName]))}" ></TextBlock> 

내가 IsNotNull를 교체해야 IsNotNullOrEmpty를 의미하는 무언가로, 그러나 나는 점점 가까워지고있다.

관련 문제