繁体   English   中英

WP7是否等于EmptyDataTemplate?

[英]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 ,并使用转换器将其可见性与ListBoxItemsSource绑定。 这应该转换器返回Visibility.Visible计数> 0Visibility.Collapsed计数== 0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM