那么SL4中有没有?
当ListBox和/或DataGrid中没有数据显示为空时,我需要显示某种信息。
如果有人熟悉其中任何一个并且可以提供示例或链接,我将不胜感激。
谢谢,
巫毒
答案 0 :(得分:1)
我还没有尝试过这个,但你可能会对下面的博客文章链接感兴趣,它为DataGrid提供了一个解决方案,你也可以适应ListBoxes。
http://subodhnpushpak.wordpress.com/2009/05/18/empty-data-template-in-silverlight-datagrid/
答案 1 :(得分:1)
我为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以更改文本。因此,您可以执行诸如“加载....”之类的操作,同时从数据库返回项目,然后在所有内容加载后将其更改为“空列表”消息。 (当然忙碌的指标可能更好)