列表框项目模板为空列表

时间:2011-03-17 10:04:56

标签: xaml windows-phone-7

我有一个列表框,其中包含在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 个答案:

答案 0 :(得分:5)

使用类似WPF的技术可能有一种XAML方法 - Listbox Item Template for an empty list

然而,在Overflow7中,我厌倦了尝试使这些工作 - 所以我使用了一个轻微的hacky技巧,而不是添加额外的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; 
        } 

(Trick从http://forums.create.msdn.com/forums/p/70755/431687.aspx学到的)

答案 1 :(得分:2)

您可以将文本块放在列表视图之外,然后使用转换器将文本块的可见性绑定到您用于列表视图的列表计数。

编辑:要求的示例: -

<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();
    }
}