绑定到Typeof的列表计数

时间:2011-10-07 12:05:10

标签: c# wpf binding inotifypropertychanged

我知道如何绑定到计数,但我该怎么做,如果我只想要计数类型为Product

<TextBlock Text="{Binding Items.Count}" />
Items = new ObservableCollection<object>();

我试过了一个属性,但是在添加或删除项目时我遇到了保持同步的问题。

    public int ProductCount
            {
                get
                {
                    return Items.Cast<object>().Count(item => item.GetType() == typeof (ProductViewModel));
                }
            }

2 个答案:

答案 0 :(得分:5)

使用LINQ OfType(),您可以在ProductCount属性getter中返回以下语句的值:

return Items.OfType<ProductViewModel>().Count();

顺便说一下,在无效检查条件下使用更安全:

return Items == null ? 0 : Items.OfType<ProductViewModel>().Count();

BTW2,在这种情况下避免使用Cast<>,因为它会在无效的强制转换操作时抛出InvalidCastException异常。

答案 1 :(得分:2)

除了获取与该类型匹配的正确数量的项目之外,您还必须保证在更改项目集合时引发视图模型的PropertyChanged事件。基本上你需要的是这样的东西:

class ProductViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    private ObservableCollection<object> m_Items;
    public ObservableCollection<object> Items
    {
        get { return m_Items; }
        set 
        { 
            if(m_Items != null)
                m_Items.CollectionChanged -= HandleItemsCollectionChanged;

            m_Items = value; 
            m_Items.CollectionChanged += HandleItemsCollectionChanged; 

            PropertyChanged(this, new PropertyChangedEventArgs("Items");
        }
    }

    public int ProductCount
    {
        get
        {
            return Items == null 
                ? 0 
                : Items.OfType<ProductViewModel>().Count();
        }
    }

    private void HandleItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        PropertyChanged(this, new PropertyChangedEventArgs("ProductCount");
    }
}