Silverlight: трудности с привязкой к видимости - PullRequest
0 голосов
/ 01 декабря 2010

У меня есть два элемента: список и сообщение «этот список пуст». Я хотел бы связать их видимость с пустым списком ItemsSource. Однако я не уверен, как это сделать:

        <TextBlock Text="No favorite searches yet. Add some by searching, then clicking 'Add to Favorites'" 
                   Padding="10,0" 
                   VerticalAlignment="Center"
                   Visibility="{Binding Path=FavoriteFilters.IsEmpty, Converter={StaticResource visibilityConverter}}"
                   />

        <ListBox ItemsSource="FavoriteFilters" 
                 x:Name="favoriteFiltersList" 
                 Visibility="{Binding Path=FavoriteFilters.IsEmpty, Converter={StaticResource visibilityConverter}}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <my:FavoriteFilterLink />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Они оба видны, хотя ItemsSource пусто. Кроме того, я не уверен, как инвертировать условие для ListBox.

Преобразователь видимости:

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

1 Ответ

1 голос
/ 01 декабря 2010

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

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

Если вы действительно хотите передать параметр, тогда вам нужно использовать ConverterParameter.

Есть пример здесь , но я не уверен на 100%, что он встретитсяваши требования.Упрощенный синтаксис XAML:

<TextBlock Visibility="{Binding FavoriteFilters.IsEmpty,
     Converter={StaticResource visibilityConverter}, ConverterParameter=false}"/>

<ListBox Visibility="{Binding FavoriteFilters.IsEmpty,
     Converter={StaticResource visibilityConverter}, ConverterParameter=true}"/>

Затем в вашем преобразователе (упрощенно):

bool show = (bool)value;
bool visible = (bool)parameter;
if (visible)
{
    return show ? Visibility.Visible : Visibility.Collapsed;
}
else
{
    return show ? Visibility.Collapsed : Visibility.Visible;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...