当ListBox不包含元素时设置默认文本

时间:2011-12-05 16:52:48

标签: silverlight windows-phone-7

当ListBox不包含任何元素时,是否可以使用某种形式的默认文本?

e.g。当我在列表中没有项目时,我想显示以下文字:please add some items

2 个答案:

答案 0 :(得分:3)

您通常需要自己处理它 - 将ListBox与您的消息重叠,并在没有要显示的项目时显示消息。您可以将消息UI的可见性绑定到与ListBox的ItemsSource相同的源,并使用转换器在ItemsSource为null时返回Visibility.Visible。我认为这不会适用于实际的集合为null,所以为此 - 您可以处理集合项目计数更改,无论您喜欢什么(代码隐藏/视图模型),并调整叠加层的可见性或实现可重用的附加属性/行为/控制。

答案 1 :(得分:0)

我提出了一个简单的列表框解决方案,在99%的情况下对我有用。设置为资源后,您只需更改列表框中的标记属性即可使所有功能正常运行。

首先,我修改列表框的默认模板以包含新网格和文本框,如下所示:

原创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 visibility属性绑定到名为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 ...如果是,则将可见性设置为可见。否则,它就会崩溃。

然后,新文本块的文本属性将绑定到列表框的标记属性。 (这不是理想的,但它是将文本输入控件的最快方法。显然,如果你将tag属性用于其他事情,这将无法工作。)

基本上,您将标记设置为要显示的消息,并且只要列表中没有项目,就会显示文本框(水平和垂直居中)。在开发过程中,您的消息将显示,因为列表为空(假设现在设计时间为datacontext),这样可以直观地显示文本。

这就是它的全部内容。

如果需要,您甚至可以将列表框的tag属性绑定到viewmodel以更改文本。所以你可以做&#34; loading ....&#34;从数据库返回项目,然后将其更改为&#34;空列表&#34;一切都加载后的消息。 (当然忙碌的指标可能更好)