Условный элемент в xaml в зависимости от содержимого связывания

Можно ли отобразить этот TextBlock, только если Address.Length > 0? Я хотел бы сделать это прямо в xaml, я знаю, что я мог бы программно программировать все мои элементы управления

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

Ответы

Ответ 1

В принципе, вам нужно будет написать IValueConverter, чтобы вы могли привязать свойство Visibility вашего TextBox либо в поле Address, либо в новом поле, которое вы создаете.

Если вы привязываетесь к полю Address, вот как привязка может выглядеть так:

<TextBlock Text="{Binding Path=Address}"
    Visibility="{Binding Path=Address, Converter={StaticResource StringLengthVisibilityConverter}" />

И тогда StringLengthVisiblityConverter может выглядеть примерно так:

public class StringLengthVisiblityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || value.ToString().Length == 0)
        {
            return Visibility.Collapsed;
        }
        else
        {
            return Visibility.Visible;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Don't need to implement this
    }
}

Тогда вам просто нужно добавить свой конвертер в качестве ресурса, используя такой синтаксис (где src отображается в пространство имен, где установлен преобразователь):

<src:StringLengthVisiblityConverter x:Key="StringLengthVisiblityConverter" />

Ответ 2

Я бы сделал это с другим булевым свойством, называемым HasAddress, которое возвращает Address.Length > 0.

<!-- In some resources section -->
<BooleanToVisibilityConverter x:Key="Bool2VisibilityConverter" />

<TextBlock 
  Text="{Binding Address}" 
  Visibility="{Binding HasAddress, Converter={StaticResource Bool2VisibilityConverter}}" 
/>

Вы также должны помнить об изменении свойства для HasAddress в установщике Address.

Ответ 3

Вы можете создать конвертер StringToVisibility.

Он вернет Visibility.Visible, если привязана строка is not null or empty и Visibility.Collapsed, если она есть.

Используйте этот конвертер, привязывая Address к свойству Visibility вашего TextBlock.

Пример:

<TextBlock Text="{Binding Path=Address}" Visibility="{Binding Address, Converter={StaticResource StringToVisibilityConverter}}" />