绑定文本块的可见性问题到Stack.Any

时间:2016-05-19 15:38:15

标签: c# xaml

我有一个TextBlock如下:

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

在我后面的代码中我定义了一个名为items的Stack,如下所示:

private Stack<Item> _items;

当_item.Any为false时,如何将xaml中的文本可见性绑定到可见?

2 个答案:

答案 0 :(得分:1)

实现您想要做的事情有几个步骤,所有这些步骤都被描述为here

您需要创建一个类似于此的值转换器;

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

然后你需要在xaml的资源字典中添加对is的引用,就像这样;

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

最后将视图模型中的属性绑定到控件的可见性,并像这样绑定转换器;

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

你的属性可能需要是一个observableCollection(这意味着要改变我稍微给你的值转换器示例。

答案 1 :(得分:0)

我可能会选择:

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

您不应直接公开_stack,例如使用方法做某事(因为每次推/弹项目时都需要提高通知):

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