Показать, если ItemsControl.ItemsSource равен нулю - PullRequest
5 голосов
/ 12 мая 2011

Привет,

У меня есть ItemsControl, шаблон которого я изменил, чтобы показать RadioButton для каждого объекта в связанном ItemsSource.

Однако ItemsSource может быть пустым, и когда он пуст, я бы хотел показать значение по умолчанию. Что-то вроде «Связанный список не содержит элементов для выбора» ...

Один из способов, о котором я подумал, - установить для ItemsControl.Visibility значение Collapsed и задать для TextBlock.Vsibility значение Visible, которое показывает текст. Но это будет включать в себя гораздо больше данных.

Можно ли показать значение по умолчанию, если ItemsControl.ItemsSource имеет значение null?

Ответы [ 4 ]

4 голосов
/ 12 мая 2011

После создания этого простого конвертера:

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();
    }
}

Вы можете переопределить шаблон ItemsControl, чтобы поддержать это, используя привязку RelativeSource.

<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 голос
/ 14 мая 2011

Вы не должны создавать конвертер, который показывает, пуст ли ваш список или нет.Лучше, когда ваш 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>
1 голос
/ 12 мая 2011

Если я правильно понял, я думаю, что вы можете решить свою проблему, создав IValueConverter.

0 голосов
/ 12 мая 2011

Одна вещь, которую вы можете сделать, это то, что после проверки ItemsControl.ItemsSource имеет значение null, вы можете добавить один элемент "The binded list contains no items for you to select".Я надеюсь, что это будет служить вашей цели.

...