绑定List <t>时,ItemsControl上的空消息为空!</t>

时间:2011-01-08 16:53:36

标签: silverlight

我正在寻找一种方式来显示消息No records found,而不是在我的List<T>时将list.Count == 0移出的ItemsControl!

我使用DataTemplateSelector WPF 中完成了一次,但似乎 Silverlight 不支持此功能!

在XAML中使用此UI逻辑而不是backend或我的ViewModel会比较容​​易,这样会很好!

TIA
Delwar

2 个答案:

答案 0 :(得分:0)

您可以使用自定义VisibilityItemsControl的{​​{1}}属性绑定到源列表;在IValueConverter内,您可以根据源集合中的项目数返回IValueConverterVisibility.Visible
对于包含“无项目”消息的Visibility.Collapsed,使用相反逻辑的转换器也是如此。

我无法解决如何使用TextBlock解决空列表问题,因为无论如何都不会应用 Empty 模板。 但是,使用DataTemplateSelectorDataTemplateSelector绑定到IValueConverter属性,您可以实现DataTemplate完全相同的行为。 但是,使用此解决方案很难返回控件Xaml中定义的DataTemplate;但是,您可以使用存储在应用程序资源中的模板。

有帮助吗?

答案 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以更改文本。因此,您可以执行诸如“加载....”之类的操作,同时从数据库返回项目,然后在所有内容加载后将其更改为“空列表”消息。 (当然忙碌的指标可能更好)