当要显示的集合为空时,我想显示一个显示“你没有数据”的文本块。
我可以通过使用转换器轻松地将此工作用于页面加载,但由于在收集数据更改时不会收到通知,因此代码不起作用: -
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可以更新。我发现自己经常编写这段代码,只需要更好的方法来处理它!
由于
罗斯
答案 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。