Установка текста по умолчанию, когда ListBox не содержит элементов - PullRequest
1 голос
/ 05 декабря 2011

Можно ли использовать некоторую форму текста по умолчанию для ListBox, когда он не содержит элементов?

например, когда у меня нет элементов в списке, я хочу показать следующий текст: please add some items

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

Как правило, вам придется обрабатывать его самостоятельно - наложить ListBox на ваше сообщение и сделать сообщение видимым, когда нет элементов для отображения. Вы можете привязать видимость пользовательского интерфейса сообщения к тому же источнику, что и ItemsSource ListBox, и использовать конвертер для возврата Visibility.Visible, когда ItemsSource равен нулю. Я не думаю, что это будет работать с нулевой фактической коллекцией, поэтому для этого - вы можете либо обрабатывать изменения количества элементов коллекции там, где вы предпочитаете (код позади / модель представления) и настраивать видимость наложения, либо реализовывать повторно используемую вложенную свойство / поведение / управления.

0 голосов
/ 05 апреля 2012

Я предложил простое решение для списков, которое работает для меня в 99% случаев.После настройки в качестве ресурса все, что вам нужно сделать, это изменить свойство Tag в списке, чтобы все функции работали.

Сначала я изменяю шаблон списка по умолчанию навключите новую сетку и текстовое поле, например:

Оригинальный XAML

<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3" Margin="0">
    <ScrollViewer x:Name="ScrollViewer" Background="Transparent" BorderBrush="Transparent" BorderThickness="0" Margin="0" Padding="0" TabNavigation="{TemplateBinding TabNavigation}">
        <ItemsPresenter Margin="0,0" />
    </ScrollViewer>
</Border>

Новый XAML

<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3" Margin="0">
    <Grid >
        <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" VerticalAlignment="Center" HorizontalAlignment="Center" Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource.Count, Converter={StaticResource ListCount2Visibility}}" Foreground="{StaticResource NormalFontBrush}" FontSize="{StaticResource DefaultFontSize}" />

        <ScrollViewer x:Name="ScrollViewer" Background="Transparent" BorderBrush="Transparent" BorderThickness="0" Margin="0" Padding="0" TabNavigation="{TemplateBinding TabNavigation}">
            <ItemsPresenter Margin="0,0" />
        </ScrollViewer>
    </Grid>
</Border>

Свойство видимости textblock привязано к пользовательскому конвертеру с именем ListCount2Visibility, который выглядит следующим образом:

public sealed class ListCount2Visibility : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null && (int)value > 0 )
            return "Collapsed";
        else
            return "Visible";

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Преобразователь значений проверяет, является ли ItemSource.Count == 0 ..., если это, он устанавливает видимость видимым.В противном случае он сворачивается.

Свойство Text нового текстового блока затем связывается со свойством Tag списка.(Это не идеально, но это самый быстрый способ получить текст в элемент управления. Очевидно, что это не сработает, если вы используете свойство тега для других целей).

Итак, в основном, вы устанавливаете тегк сообщению, которое вы хотите отобразить, и в любое время, когда в списке нет элементов, отображается текстовое поле (по центру по горизонтали и вертикали).Во время разработки ваше сообщение будет отображаться, поскольку список пуст (если предположить, что теперь время разработки datacontext), что позволяет визуализировать текст.

Это действительно все, что нужно.

ЕслиЕсли хотите, вы можете даже привязать свойство тега списка к вашей модели представления, чтобы изменить текст.Таким образом, вы можете делать такие вещи, как «загрузка ...», пока элементы возвращаются из базы данных, а затем менять их на сообщение «пустой список» после того, как все загрузится.(конечно, индикатор занятости, вероятно, лучше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...