Условный элемент в xaml в зависимости от содержимого привязки - PullRequest
16 голосов
/ 15 декабря 2010

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

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

Ответы [ 3 ]

22 голосов
/ 15 декабря 2010

Обычно вам нужно написать 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" />
7 голосов
/ 15 декабря 2010

Я бы сделал это с другим логическим свойством под названием 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 голосов
/ 15 декабря 2010

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

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

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

Пример:

<TextBlock Text="{Binding Path=Address}" Visibility="{Binding Address, Converter={StaticResource StringToVisibilityConverter}}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...