Привязать к списку списков, где Typeof - PullRequest
2 голосов
/ 07 октября 2011

Я знаю, как привязать к счету, но как мне это сделать, если мне нужен только счет, где тип равен 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 ]

5 голосов
/ 07 октября 2011

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

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

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

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

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

2 голосов
/ 07 октября 2011

Дополнительно к получению правильного количества элементов, соответствующего типу, вы должны гарантировать, что событие 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");
    }
}
...