[英]WP7 equivalent of EmptyDataTemplate?
许多ASP.NET数据绑定控件公开了EmptyDataTemplate,该控件绑定到空数据源时将呈现该模板。 在我的WP7应用程序中,当绑定到ListBox的数据源为空时,我也想显示一条友好消息。 是否有合理而优雅的方法来实现这一目标? 最好与caliburn.micro?集成/可与caliburn.micro?集成。
谢谢!!
我不喜欢在功能后面使用代码。 我宁愿建议在绑定标记中实现可使用的DataTemplateConverter以实现此确切功能。
举个例子:
<ContentControl ContentTemplate="{Binding Converter={StaticResource templateConverter}, Path=yourbindingpath}"/>
转换器将在xaml文件的resource部分中实例化。
<myControls:EmptyDataTemplateConverter x:Key="templateConverter">
<myControls:EmptyDataTemplateConverter.NonEmpty>
<DataTemplate>[...]</DataTemplate>
</myControls:EmptyDataTemplateConverter.NonEmpty>
<myControls:EmptyDataTemplateConverter.Empty>
<DataTemplate>[...]</DataTemplate>
</myControls:EmptyDataTemplateConverter.Empty>
</myControls:EmptyDataTemplateConveter>
在这种情况下,Empty / NonEmpty实现取决于您。
要了解如何实现这样的ValueConverter,请参阅MSDN (或Google)
样品已添加。 您可以为DataTemplate使用依赖项属性,但是为了简洁起见,我在此处省略了此内容。
public class EmptyDataTemplateConverter: IValueConverter
{
public DataTemplate Empty{get;set;}
public DataTemplate NonEmpty{get;set;}
// This converts the DateTime object to the DataTemplate to use.
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if(IsEmpty(value))
{
return this.Empty;
}
else
{
return this.NonEmpty;
}
}
//Your "empty/not empty" implementation here. Mine is rather... incomplete.
private bool IsEmpty(object value)
{
return value!=null;
}
// No need to implement converting back on a one-way binding
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
编辑:实现相同目标的其他方法,但在“ Silverlight方式”中要多一些。 使用GoToStateAction和适当的触发器。 将模板图形封装在UserControl中,并为此UserControl指定状态。 这样,用户控件将根据触发器的行为(空/非空)进行更改。
结果将与我以前的主张相同,但是具有状态更改动画的额外好处,而使用DataTemplateConverter则很难实现(修改TransitioningContentControl)。
不确定caliburn.micro,但是例如,如果您要绑定到ObservableCollection<T>
(我认为,绑定到任何东西的最佳集合),则有CollectionChanged
事件处理程序。
可以这么说:
ObservableCollection<string> c = new ObservableCollection<string>();
c.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(c_CollectionChanged);
在这里,在事件处理程序本身中,您可以检查触发集合是否为空:
void c_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (((ObservableCollection<string>)sender).Count == 0)
{
// Action here
}
}
Silverlight中没有开箱即用的功能。
但是,您可以做的是创建带有适当消息的TextBlock
,并使用转换器将其可见性与ListBox
的ItemsSource绑定。 这应该转换器返回Visibility.Visible
当计数> 0和Visibility.Collapsed
当计数== 0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.