WPF: видимость привязки по содержимому строки - PullRequest
16 голосов
/ 23 января 2010

Хорошо, вот мой XAML:

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

Если InstanceName является нулем или пустой строкой, я хочу Visibility="Collapsed". В противном случае я хочу Visibility="Visible". Как бы я это сделал?

Ответы [ 5 ]

43 голосов
/ 23 января 2010

Вы можете использовать ValueConverter:

<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;
    }
}
3 голосов
/ 23 января 2010

Если вы находитесь внутри (Data-) шаблона, вы можете использовать Триггеры для этого.

В противном случае вам поможет MVVM-Pattern или ValueConverter .

1 голос
/ 23 января 2010

Поместив в вашу модель представления дополнительное свойство, с которым вы можете связать атрибут Visibility:

public class ViewModel
{
   public string InstanceName {...}
   public Visibility InstanceVisibility 
   { 
      get 
      {
           return String.IsNullOrEmpty(InstanceName) ? Visibility.Collapsed : Visibility.Visible;
      }
}
0 голосов
/ 25 января 2010

Хорошо, так что это близко к PyBinding:

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

Мне нужно заменить IsNotNull чем-то, что означает IsNotNullOrEmpty, но я все ближе.

0 голосов
/ 23 января 2010
<TextBlock Text="{Binding Path=InstanceName},FallbackValue={x:Null}"></TextBlock>

Затем добавьте DataTrigger, чтобы проверить, что значение равно нулю, и измените видимость с помощью Setter. Это простой метод, который я использую.

...