Привязать к количеству списка, где Typeof

Я знаю, как привязать к подсчету, но как мне это сделать, если мне нужен только подсчет, где тип — продукт

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

Я пытался использовать свойство, но у меня возникли проблемы с его синхронизацией при добавлении или удалении элементов.

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

person gulbaek    schedule 07.10.2011    source источник
comment
Вы пытались использовать метод расширения LINQ TypeOf‹T›?   -  person mtijn    schedule 07.10.2011


Ответы (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");
    }
}
person Florian Greinacher    schedule 07.10.2011
comment
В методе Items.Set я бы отменил регистрацию предыдущего обработчика событий, если m_Items не равен нулю. - person Andreas; 07.10.2011

Используя LINQ OfType(), вы можете вернуть значение следующего оператора в свойстве ProductCount геттер:

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

Кстати, чтобы быть более безопасным, используйте следующее условие нулевой проверки:

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

Кстати 2, избегайте использования Cast‹> в таких случаях, поскольку исключение InvalidCastException в случае недопустимой операции приведения.

person sll    schedule 07.10.2011
comment
Пришлось принять другой ответ, так как он был более полным, но большое спасибо за ваш ответ, он был очень полезен. - person gulbaek; 09.10.2011