我正在寻找一种方式来显示消息No records found
,而不是在我的List<T>
时将list.Count == 0
移出的ItemsControl!
我使用DataTemplateSelector
在 WPF 中完成了一次,但似乎 Silverlight 不支持此功能!
在XAML中使用此UI逻辑而不是backend
或我的ViewModel
会比较容易,这样会很好!
TIA
Delwar
答案 0 :(得分:0)
您可以使用自定义Visibility
将ItemsControl
的{{1}}属性绑定到源列表;在IValueConverter
内,您可以根据源集合中的项目数返回IValueConverter
或Visibility.Visible
。
对于包含“无项目”消息的Visibility.Collapsed
,使用相反逻辑的转换器也是如此。
我无法解决如何使用TextBlock
解决空列表问题,因为无论如何都不会应用 Empty 模板。
但是,使用DataTemplateSelector
将DataTemplateSelector
绑定到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以更改文本。因此,您可以执行诸如“加载....”之类的操作,同时从数据库返回项目,然后在所有内容加载后将其更改为“空列表”消息。 (当然忙碌的指标可能更好)