代码之家  ›  专栏  ›  技术社区  ›  VoodooChild

空时列表框和数据网格的silverlight模板?

  •  2
  • VoodooChild  · 技术社区  · 14 年前

    当列表框和/或数据网格为空时没有数据显示时,我需要显示某种信息。

    谢谢,

    伏都教

    2 回复  |  直到 14 年前
        1
  •  1
  •   Chris Taylor    14 年前

    我自己还没有尝试过,但是您可能对下面的blog post链接感兴趣,它为DataGrid提供了一个解决方案,您也可以对列表框进行调整。

    http://subodhnpushpak.wordpress.com/2009/05/18/empty-data-template-in-silverlight-datagrid/

        2
  •  1
  •   Mike S.    12 年前

    标签

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

    原始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>
    

    <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>
    

    这个 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以更改文本。因此,您可以在从数据库返回项时执行“loading….”之类的操作,然后在加载所有项后将其更改为“empty list”消息。(当然占线指示器可能更好)