许多ASP.NET数据绑定控件公开当控件绑定到空数据源时呈现的EmptyDataTemplate。在我的WP7应用程序中,当绑定到ListBox的数据源为空时,我也想显示友好消息。是否有一种相当优雅的方式来实现这一目标?最好是与caliburn.micro集成/能够?
谢谢!
答案 0 :(得分:1)
我不喜欢使用代码来实现这样的功能。我宁愿建议在绑定标记中实现一个可用的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(或Google)
添加样本。你可以使用DataTemplate的依赖属性,但是对于brievty我在这里捣乱了。
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指定States。这样,用户控件将根据触发器的行为(Empty / not empty)进行更改。
结果将与我以前的命题相同,但具有状态更改动画的额外好处,这很难用DataTemplateConverter实现(修改TransitioningContentControl)。
答案 1 :(得分:0)
不确定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
}
}
答案 2 :(得分:0)
Silverlight 中没有开箱即用的功能。
然而,您可以创建一个带有正确消息的TextBlock
,并使用转换器将其与ListBox
的 ItemsSource 绑定。当 Count&gt;时,该转换器应返回Visibility.Visible
当 Count == 0 。
Visibility.Collapsed