我知道如何绑定到计数,但我该怎么做,如果我只想要计数类型为Product
<TextBlock Text="{Binding Items.Count}" />
Items = new ObservableCollection<object>();
我试过了一个属性,但是在添加或删除项目时我遇到了保持同步的问题。
public int ProductCount
{
get
{
return Items.Cast<object>().Count(item => item.GetType() == typeof (ProductViewModel));
}
}
答案 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");
}
}