Авторазмер / макет текстового блока wpf в стеке - PullRequest
0 голосов
/ 03 декабря 2009

У меня есть следующая панель стека

<StackPanel>
                <TextBlock Text="{Binding AddressLine1}" />
                <TextBlock Text="{Binding AddressLine2}" />
                <TextBlock Text="{Binding AddressLine3}"  />
                <TextBlock Text="{Binding AddressLine4}"  />
</StackPanel>

и моя строка AddressLine2 равна нулю для связанного объекта.

Моя панель стека отображается как

| AddressLine1 |
|              |
| AddressLine3 |
| AddressLine4 |

но я хочу, чтобы он выглядел как

| AddressLine1 |
| AddressLine3 |
| AddressLine4 |

возможно ли это, или я упускаю очевидный способ сделать это?

Спасибо, Chris

Ответы [ 3 ]

2 голосов
/ 03 декабря 2009

Создайте конвертер, который реализует IMultiValueConverter, затем используйте MultiBinding для текста, чтобы у вас был только один TextBlock с каждой строкой, как это:

class MultiStringConverter : IMultiValueConverter
{
    public object Convert( object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture )
    {
        var text = new StringBuilder( );
        for ( int i = 0 ; i < values.Length ; i++ ) {
            string line = String.Format( "{0}", values[i] );
            if ( !String.IsNullOrEmpty( line ) ) {
                text.AppendLine( line );
            }   // if
        }
        return text.ToString( );
    }

    public object[] ConvertBack( object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture )
    {
        throw new NotImplementedException( );
    }
}

А в XAML ...

    <TextBlock>
        <TextBlock.Text>
            <MultiBinding>
                <MultiBinding.Converter>
                    <Local:MultiStringConverter />
                </MultiBinding.Converter>
                <Binding Path="AddressLine1" />
                <Binding Path="AddressLine2" />
                <Binding Path="AddressLine3" />
                <Binding Path="AddressLine4" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>
0 голосов
/ 03 декабря 2009

вы можете использовать Trigger for TextBlock для проверки того, имеет ли текст значение NULL, и в этом случае установить для Visibility значение Collapsed.

0 голосов
/ 03 декабря 2009

Вы можете привязать видимость TextBlock к свойству Text, используя ValueConverter

...