显示ItemsControl.ItemsSource是否为null

时间:2011-05-12 11:11:02

标签: c# silverlight xaml binding itemssource

问候,

我有一个ItemsControl,我更改了模板,为绑定的ItemsSource中的每个对象显示一个RadioButton。

然而,ItemsSource可以为空,当它为空时我想显示默认值。像“绑定列表中没有可供您选择的项目”......

我想到的一种方法是将ItemsControl.Visibility设置为Collapsed,并将TextBlock.Vsibility设置为Visible,显示文本..但这将包含更多数据。

如果ItemsControl.ItemsSource为空,是否可以显示默认值?

4 个答案:

答案 0 :(得分:4)

创建这个简单的转换器后:

public class AnyItemsToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var collection = value as IEnumerable;
        if (collection == null)
            return Visibility.Collapsed;

        return collection.OfType<object>().Any() ? Visibility.Collapsed : Visibility.Visible;
    }

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

您可以使用RelativeSource Binding覆盖ItemsControl模板以支持它。

<UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SilverlightApplication1">
    <UserControl.Resources>
        <local:AnyItemsToVisibilityConverter x:Key="AnyItemsToVisibilityConverter" />
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White">
        <ItemsControl>
            <ItemsControl.Template>
                <ControlTemplate TargetType="ItemsControl">
                    <Grid>
                        <TextBlock Text="No Items to Display" 
Visibility="{Binding Items, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource AnyItemsToVisibilityConverter}}" />
                        <ItemsPresenter />
                    </Grid>
                </ControlTemplate>     
            </ItemsControl.Template>
        </ItemsControl>
    </Grid>
</UserControl>

答案 1 :(得分:1)

如果我理解正确,我认为您可以通过创建IValueConverter来解决您的问题。

答案 2 :(得分:1)

你不应该创建一个转换器来显示你的List是否为空。当您的XAML,转换器和数据源是完全独立的项目时,它会更好。关于松耦合的MVVM不是吗?

好吧,背后的代码是邪恶的。感谢您指出了这一点。 我更正了源代码,它现在完全是声明式的:

       <ControlTemplate x:Key="ListBoxTemplate" TargetType="ListBox">
            <StackPanel>
            <ItemsPresenter  
                 Visibility="{Binding Path=NotEmpty,
                Converter={StaticResource BoolToVisibilityConverter}}">
            </ItemsPresenter>
                <TextBlock Text="No items to select from" 
                 Visibility="{Binding Path=Empty,
                 Converter={StaticResource BoolToVisibilityConverter}}"/>
            </StackPanel>
        </ControlTemplate>

        <Style x:Key="ListBoxStyle2" TargetType="ListBox"  >
            <Setter Property="Template" Value="{StaticResource ListBoxTemplate}">
            </Setter>
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <StackPanel />
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Style>

答案 3 :(得分:0)

您可以做的一件事是,在检查ItemsControl.ItemsSource为空后,您可以添加单个项目"The binded list contains no items for you to select"。我希望这能满足你的目的。