如果ObservableCollection为空,则显示文本块

时间:2012-12-20 08:27:37

标签: silverlight windows-phone-7 xaml windows-store-apps

当要显示的集合为空时,我想显示一个显示“你没有数据”的文本块。

我可以通过使用转换器轻松地将此工作用于页面加载,但由于在收集数据更改时不会收到通知,因此代码不起作用: -

TextBlock Visibility="{Binding Devices, Converter={StaticResource EmtpyListToVisibility}, Mode=OneWay}" Text="You have no devices added, please press the Add Device button on the application bar" TextWrapping="Wrap"></TextBlock>

<phone:LongListSelector Margin="0,12,0,0" ItemsSource="{Binding Devices, Mode=OneWay}" ItemTemplate="{StaticResource DeviceTemplate}" LayoutMode="List" VerticalAlignment="Top" >                       
</phone:LongListSelector>

在Windows 8应用程序中,我添加了一个名为xxxHasRecords的属性,然后我订阅了Observable集合CollectionChanged事件并使用了属性通知,因此我的UI可以更新。我发现自己经常编写这段代码,只需要更好的方法来处理它!

由于

罗斯

2 个答案:

答案 0 :(得分:5)

您应该绑定到ObservableCollection属性,而不是绑定到ObservableCollection.Count。该集合实现了INotifyPropertyChanged,因此只要其大小发生变化,它就会通知您的绑定。您的值转换器只需检查零。

答案 1 :(得分:1)

在这种情况下,我使用BooleanToVisibilityConverter

public class BooleanToVisibilityConverter : IValueConverter {

  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
    bool invert = false;

    if (parameter != null ) {
      invert = System.Convert.ToBoolean(parameter);
    }

    bool isVisible = System.Convert.ToBoolean(value);

    if (invert) {
      isVisible = !isVisible;
    }

    return isVisible ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
  }

  public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
    Visibility result = (Visibility) Enum.Parse(typeof(Visibility), value.ToString(), true);

    return result == Visibility.Visible ? true : false;
  }
}

并将TextBox的Visibility-Property的绑定更改为以下

<TextBlock Visibility="{Binding Devices.Count, Converter={StaticResource boolToVisibilityConverter}, Mode=OneWay}"
           Text="You have no devices added, please press the Add Device button on the application bar"
           TextWrapping="Wrap">
</TextBlock>

当Collection为空时Count返回值0. Converter使用System.Convert.ToBoolean,它将0转换为false,所有其他值转换为true。

False以Visibility.Collapsed的形式返回,True为Visibility.Visible。