我正在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
堆栈面板永远不会崩溃。
答案 0 :(得分:0)
您好像回答了自己的问题。是的,您可以简单地将Visibility(或BusyIndicator控件上的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属性的BusyIndicator控件会更好:
<Controls:BusyIndicator IsBusy="{Binding IsBusy}">
只需将它放在您希望隐藏在繁忙显示屏上的控件周围。