Silverlight:在没有代码的情况下删除内容加载上的加载消息?

时间:2010-11-04 16:17:56

标签: c# silverlight windows-phone-7

我正在Silverlight中构建一个wp7应用程序。我有一些异步加载的内容,以及指示尚未加载的消息。一旦内容的列表框不为空,我想让加载消息消失。是否可以在XAML中执行此操作?将Visibility属性绑定到StoryListBox.ItemsSource.IsEmpty

之类的东西

StoryListBox通过在数据可用后将ItemsSource设置为可观察集合来填充。

    <TextBox x:Name="LoadingMessage"  Text="Loading..." Grid.Row="0" />
    <ProgressBar x:Name="LoadingProgress" IsIndeterminate="True" Style="{StaticResource PerformanceProgressBar}" />

    <ListBox x:Name="StoryListBox" Grid.Row="0" />

更新:我尝试了以下操作,但它不起作用:

  <StackPanel x:Name="Loading" Grid.Row="0" Visibility="{Binding StoryListBox.ItemsSource.IsEmpty, Converter={StaticResource visibilityConverter}}">
            <TextBox Text="Loading..." />
            <ProgressBar IsIndeterminate="True" Style="{StaticResource PerformanceProgressBar}" />
        </StackPanel>

        <ListBox x:Name="StoryListBox" Grid.Row="1" />

Loading堆栈面板永远不会崩溃。

1 个答案:

答案 0 :(得分:0)

您好像回答了自己的问题。是的,您可以简单地将Visibility(或BusyIndi​​cator控件上的Busy / IsBusy)绑定到另一个控件的某个属性。

如果要绑定的特定属性不是可绑定属性,只需绑定到另一个控件并自定义转换器以获取所需的成员属性。如果您有特定的代码示例,只需发布​​它们,我就可以发布更具体的解决方案。

通常的问题是类型(用于可见性)与布尔值不兼容,因此您需要在绑定中指定转换器。谷歌的Silverlight VisibilityConvertor(他们是一打一打)。这是我的:

namespace Common.ValueConverters
{
    using System;
    using System.Windows;
    using System.Windows.Data;

    public class VisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is bool?)
            {
                if (string.IsNullOrEmpty((string)parameter))
                {
                    return (value as bool?).Value ? Visibility.Visible : Visibility.Collapsed;
                }
                else
                {
                    return (value as bool?).Value ? Visibility.Collapsed : Visibility.Visible;
                }
            }
            throw new ArgumentException();
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

转换器的使用方式如下:

<Grid Visibility="{Binding ShowDualView, Converter={StaticResource VisibilityConverter}}">

但坦率地说,使用绑定到IsBusy属性的BusyIndi​​cator控件会更好:

<Controls:BusyIndicator IsBusy="{Binding IsBusy}">

只需将它放在您希望隐藏在繁忙显示屏上的控件周围。