许多 ASP.NET 数据绑定(bind)控件公开了一个 EmptyDataTemplate,当控件绑定(bind)到空数据源时呈现该模板。在我的 WP7 应用程序中,当绑定(bind)到 ListBox 的数据源为空时,我也想显示一条友好的消息。有没有一种相当优雅的方法来实现这一目标?最好与 caliburn.micro 集成/能够集成?
谢谢!!
最佳答案
我不喜欢为这样的功能使用代码隐藏。我宁愿推荐实现一个可在绑定(bind)标记中使用的 DataTemplateConverter 来实现这个确切的功能。
例如:
<ContentControl ContentTemplate="{Binding Converter={StaticResource templateConverter}, Path=yourbindingpath}"/>
转换器将在 xaml 文件的资源部分中实例化。
<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 (或谷歌)
示例已添加。您可以使用 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)。
关于c# - WP7 相当于 EmptyDataTemplate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5208654/