좋아, 여기 내 XAML은 다음과 같습니다.WPF : 문자열 내용 별 가시성 바인딩
<TextBlock Text="{Binding Path=InstanceName}"></TextBlock>
InstanceName
이 null이거나 빈 문자열이면 Visibility="Collapsed"
가 필요합니다. 그렇지 않으면 나는 Visibility="Visible"
을 원한다. 내가 어떻게 그럴 수 있니?
좋아, 여기 내 XAML은 다음과 같습니다.WPF : 문자열 내용 별 가시성 바인딩
<TextBlock Text="{Binding Path=InstanceName}"></TextBlock>
InstanceName
이 null이거나 빈 문자열이면 Visibility="Collapsed"
가 필요합니다. 그렇지 않으면 나는 Visibility="Visible"
을 원한다. 내가 어떻게 그럴 수 있니?
다음 코드 숨김과
<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;
}
}
.
그렇지 않으면, MVVM-패턴 또는 ValueConverter 당신을 도움이 될 것입니다.
나는 그것을 좋아하지 않습니다. 모델은 여러보기에서 공유해야하지만이 동작은이보기에서만 필요합니다. –
이보기와 뷰 모델 간에는 일대일 관계가 있습니다. 공통된 기능을 공유하는 뷰가 있다면 공통 부분을 추출하여 공통 뷰 모델 슈퍼 클래스에 넣을 수 있습니다. –
그 말이 맞지 않습니다. 나는 'ViewModels'에 익숙하지 않지만 고전 MVC를 사용하면 여러 개의 뷰를 동일한 모델 인스턴스에 바인딩 할 수 있습니다. 그렇게하면 한 창에서 편집하고 다른 창에서 실시간으로 업데이트 된 것을 볼 수 있습니다. –
당신이 트리거 그런에 대한을 사용할 수 있습니다 : 당신의 가시성 속성을 바인딩 할 수있는 뷰 모델에 추가 속성을 둬서
+1 값 변환기가 정확합니다. –
트리거와 ValueConverter 모두 테스트 할 수 없습니다. –
유일한 진정한 테스트는 원하는 효과에 대한 결과를 육안으로 검사하는 것이므로 "테스트 가능"하지 않습니다. –
<TextBlock Text="{Binding Path=InstanceName},FallbackValue={x:Null}"></TextBlock>
는 그 값이 널 세터를 이용하여 변경 시인성 확인하는 추가 DataTrigger. 이것은 iam이 사용하는 간단한 방법입니다.
당신은 ValueConverter 사용할 수흥미 롭습니다. 하지만이 InstanceName == String.Empty 함께 작동하지 않습니다 ... –
좋아, 그래서이 PyBinding에 가까운 :
<TextBlock Text="{Binding Path=InstanceName}" Visibility="{p:PyBinding BooleanToVisibility(IsNotNull($[.InstanceName]))}" ></TextBlock>
내가 IsNotNull를 교체해야 IsNotNullOrEmpty를 의미하는 무언가로, 그러나 나는 점점 가까워지고있다.
나는 그 일을 볼 수 있지만 정말 지루한 얻을 것. 나는 더 나은 길을 찾아야한다고 생각합니다. –
지루한 부분은 무엇이라고 생각하십니까? 가시성과 텍스트를 별도로 설정하는 것이 지루할 수 있다고 생각하십니까? 또는 일반적으로 valueconverters라고 생각합니까? "InstanceName"을 반복하지 않도록 path = Name을 사용하여 visibility 속성을 relativesource로 바인딩하는 것이 좋습니다. 이외의 다른 방법이 없습니다.이 방법이 지루할 수 있음을 모르겠다. (항상 독자적으로 MarkupExtensions를 작성할 수도 있고,이를 수행 할 수있는 동작을 작성할 수도 있지만, 맨 위에 있고 valueconverter는 옳은 일) –