iamsharp
iamsharp

Reputation: 39

Binding Visibility propety of text block to Stack.Any

I have a TextBlock as follow:

<TextBlock Text="You don't have any more items." Visibility="{binding}"

and in code behind I defined a Stack called items as follow:

private Stack<Item> _items;

How do I bind the text visibility in xaml to visible when _item.Any is false?

Upvotes: 2

Views: 47

Answers (2)

mark_h
mark_h

Reputation: 5487

There are several steps to achieving what you want to do and they are all described here

You need to create a value converter similar to this;

public class EmptyCollectionToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var collection = (Stack<int>) value;
        return collection.Any() ? Visibility.Visible : Visibility.Collapsed;
    }

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

Then you need to add a reference to is in your resource dictionary in your xaml like this;

 <views:EmptyCollectionToVisibilityConverter x:Key="EmptyCollectionToVisibilityConverter"/>

Finally bind your property in your view model to the visibility of your control and give the binding the converter like this;

Visibility="{Binding Items, Converter={StaticResource EmptyCollectionToVisibilityConverter}}"

Your property will probably need to be an observableCollection (which will mean changing the value converter example I gave you slightly.

Upvotes: 1

Sinatr
Sinatr

Reputation: 22008

I'd probably go with:

private Stack<Item> _items;
// bind to this property using converter
public bool IsVisible => !(_items?.Any(...) ?? false);

You shouldn't expose your _stack directly, but e.g. use methods to do something (because you need to rise notification every time you push/pop an item):

public void PushItem(Item item)
{
    _items.Push(item);
    OnPropertyChanged(nameof(IsVisible)); // implement INotifyPropertyChanged
}

Upvotes: 0

Related Questions