开发者

Silverlight: Difficulty with binding to visiblity

I have two elements: a listbox and a "this list is empty" message. I'd like to bind their visibility to the list box's ItemsSource being empty. However, I'm not sure how to do this:

        <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>

They are both visible, although the ItemsSource is empty. Also, I'm not sure how to invert the condition for the ListBox.

The visibility converter:

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


You might be better off writing two converters, one for the ListBox the other for the TextBlock. The logic of each would be simpler and you wouldn't need to pass a parameter to get the correct result.

While it might not be as elegant as a single converter solution it will be far more maintainable.

If you really want to pass a parameter then you need to use the ConverterParameter.

There's an example here but I'm not 100% sure it'll meet your requirements. The simplified XAML syntax is:

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

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

Then in your converter (simplified):

bool show = (bool)value;
bool visible = (bool)parameter;
if (visible)
{
    return show ? Visibility.Visible : Visibility.Collapsed;
}
else
{
    return show ? Visibility.Collapsed : Visibility.Visible;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜