WP7相当于EmptyDataTemplate?

时间:2011-03-06 04:13:30

标签: c# silverlight xaml windows-phone-7 caliburn.micro

许多ASP.NET数据绑定控件公开当控件绑定到空数据源时呈现的EmptyDataTemplate。在我的WP7应用程序中,当绑定到ListBox的数据源为空时,我也想显示友好消息。是否有一种相当优雅的方式来实现这一目标?最好是与caliburn.micro集成/能够?

谢谢!

3 个答案:

答案 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

时0 Visibility.Collapsed