【问题标题】:Show a textblock if an ObservableCollection is Empty如果 ObservableCollection 为空,则显示文本块
【发布时间】:2012-12-20 08:27:37
【问题描述】:

当应显示的集合为空时,我想显示一个文本块,上面写着“您没有数据”。

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

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。我发现自己经常编写这段代码,所以必须有更好的方法来处理它!

谢谢

罗斯

【问题讨论】:

  • 使用转换器会拖慢你的应用程序,为什么不将TextBlock和ListBox放在同一个Grid.Row中,当ObservableCollection为空时它们的切换可见性
  • 我怎么知道 observable 集合是否为空?我可能应该提到我正在使用 MVVM - 我怀疑是非常关键的信息:-)

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在这种情况下,我使用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 属性的绑定更改为以下内容:

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

    当集合为空时,Count 返回值 0。转换器使用 System.Convert.ToBoolean 将 0 转换为 false,并将所有其他值转换为 true

    False 作为Visibility.Collapsed 返回,true 作为Visibility.Visible 返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 2016-03-08
      • 2017-10-07
      相关资源
      最近更新 更多