Silverlight: Удалить загрузочное сообщение при загрузке контента без кода позади? - PullRequest
2 голосов
/ 04 ноября 2010

Я создаю приложение wp7 в Silverlight.У меня есть некоторый контент, который загружается асинхронно, и сообщения, которые указывают, что загрузка еще не завершена.Я хотел бы, чтобы сообщения о загрузке исчезали, как только поле со списком содержимого не пусто.Можно ли сделать это только в XAML?Что-то вроде привязки свойства Visibility к StoryListBox.ItemsSource.IsEmpty?

StoryListBox заполняется установкой его ItemsSource в наблюдаемую коллекцию после того, как данные становятся доступны.

    <TextBox x:Name="LoadingMessage"  Text="Loading..." Grid.Row="0" />
    <ProgressBar x:Name="LoadingProgress" IsIndeterminate="True" Style="{StaticResource PerformanceProgressBar}" />

    <ListBox x:Name="StoryListBox" Grid.Row="0" />

Обновление : я попробовал следующее, но оно не работает:

  <StackPanel x:Name="Loading" Grid.Row="0" Visibility="{Binding StoryListBox.ItemsSource.IsEmpty, Converter={StaticResource visibilityConverter}}">
            <TextBox Text="Loading..." />
            <ProgressBar IsIndeterminate="True" Style="{StaticResource PerformanceProgressBar}" />
        </StackPanel>

        <ListBox x:Name="StoryListBox" Grid.Row="1" />

Панель стека Loading никогда не разрушается.

1 Ответ

0 голосов
/ 04 ноября 2010

Вы, кажется, ответили на свой вопрос. Да, вы можете просто привязать Visibility (или Busy / IsBusy в элементе управления BusyIndicator к некоторому атрибуту другого элемента управления).

Если конкретное свойство, с которым вы хотите связать, не является привязываемым свойством, просто свяжите его с другим элементом управления и настройте конвертер, чтобы получить желаемое свойство элемента. Если у вас есть конкретные примеры кода, просто опубликуйте их, а я могу опубликовать более конкретное решение.

Обычная проблема заключается в том, что типы (для наглядности) несовместимы с логическими значениями, поэтому вам необходимо указать конвертер в привязке. Google для Silverlight VisibilityConvertor (их десять центов). Вот мой:

namespace Common.ValueConverters
{
    using System;
    using System.Windows;
    using System.Windows.Data;

    public class VisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is bool?)
            {
                if (string.IsNullOrEmpty((string)parameter))
                {
                    return (value as bool?).Value ? Visibility.Visible : Visibility.Collapsed;
                }
                else
                {
                    return (value as bool?).Value ? Visibility.Collapsed : Visibility.Visible;
                }
            }
            throw new ArgumentException();
        }

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

Использование конвертера будет выглядеть так:

<Grid Visibility="{Binding ShowDualView, Converter={StaticResource VisibilityConverter}}">

Но, откровенно говоря, вам лучше использовать элемент управления BusyIndicator, связанный со свойством IsBusy:

<Controls:BusyIndicator IsBusy="{Binding IsBusy}">

Просто поместите его вокруг элементов управления, которые вы хотите скрыть на занятом дисплее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...