Шаблон элемента списка для пустого списка - PullRequest
8 голосов
/ 17 марта 2011

У меня есть список с шаблоном элемента, определенным в XAML следующим образом:

        <ListBox Name="listBoxDisruptions">

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="0,0,0,10">
                        <TextBlock Text="{Binding text}" Foreground="Black" FontSize="29">Hello! some item</TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>             

        </ListBox>

Теперь мне нужно отобразить строку текста в центре списка, если ItemSource для этого списка пуст.

Поддерживает ли XAML какой-либо шаблон без элементов? как то так:

    <ListBox Name="listBoxDisruptions">

                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="0,0,0,10">
                            <TextBlock Text="{Binding text}" Foreground="Black" FontSize="29">Hello! some item</TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate> 

<ListBox.NoItemTemplate>
<TextBlock Text="No Items to display"/>
</ListBox.NoItemTemplate>                   

            </ListBox>

Так?

Ответы [ 2 ]

5 голосов
/ 17 марта 2011

Может быть способ XAML сделать это, используя методы, подобные WPF - Шаблон элемента списка для пустого списка

Однако в Overflow7 мне стало скучно пытаться заставить их работать - поэтому я использовал немного хакерский прием вместо добавления дополнительного TextBlock на страницу и затем использовал:

private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { 
            listBox1.ItemsSource = data; 

            data.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(data_CollectionChanged); 

        } 

        void data_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { 
            if (data.Count == 0) 
                textBlock1.Visibility = Visibility.Visible; 
            else 
                textBlock1.Visibility = Visibility.Collapsed; 
        } 

(Трюк извлечен из http://forums.create.msdn.com/forums/p/70755/431687.aspx)

2 голосов
/ 04 февраля 2014

Вы можете вывести текстовый блок за пределы списка, а затем связать видимость текстового блока с счетчиком списка, который вы используете для просмотра списка, с помощью конвертера.

РЕДАКТИРОВАТЬ: Пример в соответствии с запросом:-

<ListView ItemsSource="{Binding MyItemSource}">
   <ListView.ItemTemplate>
     <DataTemplate>
       <Grid/>
     </DataTemplate>
   </ListView.ItemTemplate>
</ListView>
<TextBlock Text="Some text" Visibility="{Binding MyItemSource.Count, Converter={StaticResource CountToVisibilityConverter}}"/>

Объявите конвертер либо в ресурсах вашей страницы, либо в словаре ресурсов в вашем приложении следующим образом:

<converters:CountToVisibilityConverter x:Key="CountToVisibilityConverter" />

, и тогда конвертер может быть:

public sealed class CountToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string culture)
    {
        if (value != null)
        {
            var i = (Int32)value;

            if (i > 0)
                return Visibility.Collapsed;
            else
                return Visibility.Visible;
        }
        return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string culture)
    {
        return new NotImplementedException();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...